6.10.7 使用__call()重载方法

前面,我们介绍了一些具有特殊意义的类方法,这些方法的名称都是以双下画线开始的(),例如,get()、set()、construct()和destruct()。另一个示例就是call()方法,在PHP中,该方法用来实现方法的重载。

方法的重载在许多面向对象编程语言中都是常见的,但是在PHP中却不是非常有用,因为我们习惯使用灵活的类型和(容易实现的)可选的函数参数。

要使用该方法,必须实现__call()方法,如下例所示:


public function_call($method,$p)

{

if($method=="display"){

if(is_object($p[0])){

$this->displayObject($p[0]);

}else if(is_array($p[0])){

$this->displayArray($p[0]);

}else{

$this->displayScalar($p[0]);

}

}

}


__call()方法必须带有两个参数。第一个包含了被调用的方法名称,而第二个参数包含了传递给该方法的参数数组。我们可以决定调用哪一个方法。在这种情况下,如果一个对象传递给display()方法,可以调用displayObject()方法;如果传递的是一个数组,可以调用displayArray();如果传递的是其他内容,可以调用displayScalar()方法。

要调用以上这段代码,首先必须实例化包含这个__call()方法(命名为重载)的类,然后再调用display()方法,如下例所示:


$ov=new overload;

$ov->display(array(1,2,3));

$ov->display('cat');


第一个display()方法的调用将调用displayArray()方法,而第二个将调用displayScalar()方法。

请注意,要使以上代码能够使用,不用实现任何display()方法。