PHP5 的重载根本就是一个伪操作符

来源:互联网 发布:倍投软件好用不 编辑:程序博客网 时间:2024/04/29 18:17

前几天读到PHP5的操作符重载,对此PHP提供一个函数__call($name,$arguments), 用来实现对同一函数,不同参数类型的重载。而且网上有一个简单的例子如下

 

class Caller
{      
    function __call($name,$arguments) {

        if($name=='foo') {
             if(is_int($arguments[0])) $this->foo_int($arguments[0]);
             if(is_string($arguments[0])) $this->foo_string($arguments[0]);
        }
    }  
   
    private function foo_int($x) {
        echo 'foo is integer: ',$x;
    }  
   
    private function foo_string($x) {
        echo 'foo is string: ',$x;
    }
}
$foo = new Caller();
$a = $foo->foo(3);
$b = $foo->foo("test");

 

乍一看上去这个例子似乎很不错。但是仔细看来,这个重载很容易就可以用普通的function实现了,根本不需要通过重载。这个重载函数根本就是一个伪操作。为了证明,我写例子如下,没有用到重载函数

 

class Caller2
{      
    function foo($arguments) {
        if(is_int($arguments)){
            $this->foo_int($arguments);
        }elseif(is_string($arguments)){
            $this->foo_string($arguments);
        }else{
            ....
        }
    }  
   
    private function foo_int($x) {
        echo 'foo is integer: ',$x;
    }  
   
    private function foo_string($x) {
        echo 'foo is string: ',$x;
    }
}
$foo = new Caller2();
$a = $foo->foo(3);
$b = $foo->foo("test");

 

输出结果和上面根本是一样的,似乎也更易懂一些。所以,似乎也可以下结论,PHP的重载根本就是一个伪操作符,跟java,c#的重载完全不是一回事。