【发布时间】:2013-08-26 01:56:58
【问题描述】:
假设我有一个名为 MyClass 的类,它扩展了 MyAbstractClass。
在MyClass 内有myMethod。在MyAbstractClass 内有myAsbtractClassMethod。
有没有一种方法可以在myMethod 完成时调用myAsbtractMethod 而不必将parent::myAsbtractClassMethod 放在末尾?
【问题讨论】:
假设我有一个名为 MyClass 的类,它扩展了 MyAbstractClass。
在MyClass 内有myMethod。在MyAbstractClass 内有myAsbtractClassMethod。
有没有一种方法可以在myMethod 完成时调用myAsbtractMethod 而不必将parent::myAsbtractClassMethod 放在末尾?
【问题讨论】:
不,我害怕。
如果您希望实现“执行后挂钩”风格的功能,您可以设计您的类来实现 __call() 魔术方法。例如:
<?php
abstract class AbstractTest
{
protected function myMethod()
{
echo 'Bar';
}
}
class Test extends AbstractTest
{
public function __call($methodName, $args)
{
call_user_func_array(array($this, $methodName), $args);
call_user_func_array(array('parent', $methodName), $args);
}
protected function myMethod()
{
echo 'Foo';
}
}
$test = new Test();
// Will output 'FooBar'
$test->myMethod();
通过声明 myMethod() 受到保护,您不能公开调用它。因此,它被 __call() 方法“拦截”,该方法在它自己的上下文中调用它,然后在它的父上下文中调用它。不过,这可能需要重新设计您的类的构建方式。
【讨论】: