一、概述
PHP的__call()方法是一个魔术方法,可以动态地处理对象实例化之后的方法调用。通过__call()方法,我们可以将一个对象实例的方法调用委托给另一个对象实例处理,使代码更加灵活、易于拓展。
二、使用示例
下面给出一个借助__call()方法实现委托的示例,以便更好地理解和掌握这个方法。
具体场景:假设有两个类,分别为“Price”和“Discount”,其中“Discount”类继承自“Price”类。现要实现的功能是:在“Discount”类中,对“Price”类中的所有方法进行重新实现,并在原有实现中添加一定的优惠策略。
示例说明1:
class Price
{
public function cost()
{
return 100;
}
}
class Discount extends Price
{
private $price = null;
public function __construct() {
$this->price = new Price();
}
public function __call($name, $args) {
if (method_exists($this, $name)) {
return call_user_func_array(array($this, $name), $args);
}
else {
return call_user_func_array(array($this->price, $name), $args) * 0.9;
}
}
}
$discount = new Discount();
echo $discount->cost(); // 输出90
在上面的示例中,我们定义了两个类,“Price”和“Discount”。在“Price”类中,我们定义了一个名为“cost()”的方法,该方法返回数值100。
在“Discount”类中,我们继承了“Price”类,同时重载了其中的“__call()”方法。在该方法中,我们使用了“method_exists()”函数判断是否该方法已经在当前类中定义,如果已定义,则直接调用;否则,委托给“Price”类中的同名方法,并在原有实现上打9折。最后,通过测试,我们可以看到输出的结果为90。
示例说明2:
class Price
{
public function cost()
{
return 100;
}
}
class Discount extends Price
{
private $price = null;
public function __construct() {
$this->price = new Price();
}
public function __call($name, $args) {
if ($name == "cost") {
return $this->price->cost() * 0.9;
}
else {
return $this->price->$name(...$args);
}
}
}
$discount = new Discount();
echo $discount->cost(); // 输出90
在上面的示例中,我们同样定义了两个类,“Price”和“Discount”。在“Price”类中,我们同样定义了一个名为“cost()”的方法,该方法返回数值100。
在“Discount”类中,我们同样继承了“Price”类,并重载了其中的“__call()”方法。在该方法中,我们首先判断是否为“cost()”方法,在该方法中,我们直接返回原有实现上打9折后的结果;否则,委托给“Price”类中的同名方法。最后,通过测试,我们可以看到输出的结果为90。
三、总结
以上就是PHP中使用__call()方法实现委托的攻略。总体上来说,__call()方法并不是一种推荐使用的方法,因为它容易产生“魔术”效果,增加了代码的复杂性和可维护性。不过,在一些特定的场景下,如需实现对象方法的动态委托,__call()方法仍然是一种不错的选择。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP __call()方法实现委托示例 - Python技术站