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