【问题标题】:Call method in abstract class after method of extending class?在扩展类的方法之后调用抽象类中的方法?
【发布时间】:2013-08-26 01:56:58
【问题描述】:

假设我有一个名为 MyClass 的类,它扩展了 MyAbstractClass

MyClass 内有myMethod。在MyAbstractClass 内有myAsbtractClassMethod

有没有一种方法可以在myMethod 完成时调用myAsbtractMethod 而不必将parent::myAsbtractClassMethod 放在末尾?

【问题讨论】:

    标签: php methods call


    【解决方案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() 方法“拦截”,该方法在它自己的上下文中调用它,然后在它的父上下文中调用它。不过,这可能需要重新设计您的类的构建方式。

    【讨论】:

    • 这是一个非常简洁的方法:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 2016-06-12
    相关资源
    最近更新 更多