【发布时间】:2013-04-25 08:19:31
【问题描述】:
给定扩展类 B 的类 A,如何调用类 A 的 __call 函数覆盖从父类继承的匹配函数?
考虑这个简化的例子:
class A
{
public function method_one()
{
echo "Method one!\n";
}
}
class B extends A
{
public function __call($name, $args)
{
echo "You called $name!\n";
}
}
$b = new B();
$b->method_one();
当我运行它时,我得到了输出Method one!。我想得到输出You called method_one!。
那么,如何让子类的魔法方法覆盖父类定义的方法呢?
我需要扩展对象,因为我需要访问 A 中的受保护方法,但我想将所有公共方法引导到我自己的 __call 处理程序中。有没有办法做到这一点?
【问题讨论】:
-
__call 仅覆盖无法访问的方法;您的 method_one() 是公开的,因此可以访问。尝试使其受到保护
-
你为什么不使用普通的覆盖?
-
@ShankarDamodaran 因为我有大量要覆盖的函数。我首先扩展它的唯一原因是访问我需要的受保护方法
-
您可以使用php.net/manual/en/reflectionmethod.setaccessible.php 更改您的方法的可见性,使它们不再可公开访问,以便通过__call 处理程序调用它们
-
@MarkBaker 是的!这是完美的答案。谢谢!
标签: php oop inheritance magic-methods