前几天读到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#的重载完全不是一回事。