1

假设我有一个名为MyClasswhich extends的类MyAbstractClass

里面MyClassmyMethod。里面MyAbstractClassmyAsbtractClassMethod

有没有办法我可以在完成myAsbtractMethod时调用myMethod而不必放在parent::myAsbtractClassMethod最后?

4

1 回答 1

1

不,我害怕。

如果您希望实现“执行后挂钩”风格的功能,您可以设计您的类来实现 __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() 方法“拦截”,该方法在它自己的上下文中调用它,然后在它的父上下文中调用它。不过,这可能需要重新设计您的类的构建方式。

于 2013-08-23T07:28:11.443 回答