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使用详情:



猜你喜欢

转载自blog.csdn.net/qq_34206560/article/details/79558369