前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP基础之重载技术,你学会了吗?

PHP基础之重载技术,你学会了吗?

作者头像
友儿
发布2022-09-11 14:40:51
3160
发布2022-09-11 14:40:51
举报
文章被收录于专栏:友儿

什么重载技术?

  • 面向对象语言中,一个类有多个同名方法,每个方法参数不同,这种现象就成为"重载"。
  • 参数不同可以指 数量、类型、顺序不同。

由上面定义可知PHP在同一个类定义多个相同的方法名称会直接导致语法错误,PHP的特性决定了其不支持同名函数方式的重载,但是PHP中所说的重载,另有其说,且姿势还不少。

  • 自我认为,PHP不允许名函数存在的重要原因是function_existsmethod_existsis_callable这些API的存在。

PHP中主要有以下几种重载方式:

默认参数,定义一个全面的函数版本,不是必须的值在声明时赋予默认值;

代码语言:javascript
复制
<?php

function baseFun($param0, $param1 = 1, $param2 = true, $param3 = false, $param4 = ''){
   if ($param1 === 1) {
       //TODO  fun1
   } elseif($param2 === true) {
      //TODO  fun2
   } elseif ($param3 === false) {
      //TODO  fun3
   } elseif ($param4 === '') {
      //TODO  fun4
   }
 }
?>

定义一个不声明参数的入口函数,函数内使用func_num_args(传递给函数的参数个数)/func_get_args(传递给函数的参数数组)获取参数个数/数组,然后根据参数个数转发到具体实现的函数;

代码语言:javascript
复制
<?php

function baseFun()
{
 $args = func_get_args();
 $num  = func_num_args();
 if ($num == 1) {
   func1($args[0]);
 } elseif ($num == 2) {
   func2($args[0], $args[1]);
 } else {
   //func....()
 }
}
function func1($param)
{
 echo $param; 
}
function func2($param1, $param2)
{
 echo $param1,'-----------', $param2; 
}
baseFun('a');
echo "\n";
baseFun('a', 'b');


?>

自PHP5.6起,可以用变长参数实现重载,func_get_args的另一种形式;

代码语言:javascript
复制
<?php

function open_database($a, $b=null, $c=null)
{
switch (func_num_args())
{
case 1:
  $r = fun($a);
  break;
case 2:
  $r = fun($a, $b);
  break;
case 3:
  $r = fun($a, $b, $c);
  break;
default:
    $r = null;
}
return $r;
}
function fun($a, $b = null, $c = null){
return 3;
}
?>

对于类中的成员函数,可以通过__call(在一个对象的上下文中,如果调用的方法不能访问,它将被触发)和__callStatic(在一个静态的上下文中,如果调用的方法不能访问,它将被触发)实现重载。

代码语言:javascript
复制
<?php
//__call
class BC
{
public function __call($method, $args){
//         $class = get_class();
    $method = '_' . $method;
    if (method_exists($this, $method)) {
        call_user_func_array([$this, $method], $args);
    }
}
}
class D extends BC
{
public function _fun1($param0)
{
    echo 'fun1:','param0:',$param0;
}
public function _func2($param1,$param2)
{
    echo 'fun2:','param1:',$param1,'----','param2:',$param2;
}
}
$object = new D();
echo $object->fun1(1);//fun1:param0:1
echo "\n";
echo $object->func2(1,2);//fun2:param1:1----param2:2
?>
<?php
//__callStatic
class AB
{
public static function __callStatic($method, $args)
{
    $method = '_' . $method;
    $class = get_called_class();
    if (method_exists($class, $method)) {
        call_user_func_array([$class, $method], $args);
    }
}
}
class ABSon extends AB
{
static public function _fun1($param)
{
    echo 'fun1:','param0:',$param;
}

static public function _fun2($param1, $param2)
{
    echo 'fun2:','param1:',$param1,'----','param2:',$param2;
}
}

ABSon::fun1(1);//fun1:param0:1

ABSon::fun2(2,3);//fun1:param0:1fun2:param1:2----param2:3
?>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档