PHP5 的重載根本就是一個僞操作符

前幾天讀到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#的重載完全不是一回事。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章