php实现函数重载

重载是类的多态的一种实现。函数重载指一个标识符被用作多个函数名,且能够通过函数的参数个数或参数类型将这些同名的函数区分开来,调用不发生混淆。即当调用的时候,虽然方法名字相同,但根据参数的不同可以自动调用相应的函数。
php不好实现。
可以使类里面的某个方法产生多种效果,根据传入参数不同,可以执行不同的逻辑。
有以下几点要求:
1、在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参  数个数,不同的参数顺序(参数类型必须不一样);
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;

由于实现函数的重载对提高开发效率很有帮助,如果能象C#或者C++那样,那就非常好了。事实上,PHP的提供了一个魔术方法,mixed __call ( string name, array arguments )。这个方法在php手册中也有提及,根据官方文档,称此方法可以实现函数重载。当调用对象中一个不存在的方法的时候,如果定义了__call()方法,则会调用该方法。比如下面的代码:

function __call ($name, $args )
{

    if($name=='burden')
    {
        $i=count($args);
        if (method_exists($this,$f='burden'.$i)) {
            call_user_func_array(array($this,$f),$args);
        }
    }
}
public function burden1($a1)
{
    echo "1个参数".$a1."<br/>";
}
public function burden2($a1,$a2)
{
    echo "2个参数".$a1.",".$a2."<br/>";
}
public function burden3($a1,$a2,$a3)
{
    echo "3个参数".$a1.",".$a2.",".$a3."<br/>";
}
public function arrrAction(){

    $this->burden('z');
    $this->burden('z','b');
    $this->burden('z','b','v');
}
输出:
1个参数z
2个参数z,b

3个参数z,b,v

构造函数的重载:

<?php
class A
{
    function __construct()
    {
        echo "执行构造函数<br/>";
        $a = func_get_args(); //获取构造函数中的参数
        $i = count($a);
        if (method_exists($this,$f='__construct'.$i)) {
            call_user_func_array(array($this,$f),$a);
        }
    }
    function __construct1($a1)
    {
        echo "1个参数".$a1."<br/>";
    }
    function __construct2($a1,$a2)
    {
        echo "2个参数".$a1.",".$a2."<br/>";
    }
    function __construct3($a1,$a2,$a3)
    {
        echo "3个参数".$a1.",".$a2.",".$a3."<br/>";
    }
}
$o = new A('a');
$o = new A('a','b');
$o = new A('a','b','c');
?>

输出:

执行构造函数   
1个参数a    
执行构造函数    
2个参数a,b    
执行构造函数    
3个参数a,b,c

注:

method_exists使用详情:http://blog.csdn.net/qq_34206560/article/details/79558549

func_get_args使用详情:

call_user_func_array使用详情:



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值