【问题标题】:Conditionally override a method in PHP有条件地覆盖 PHP 中的方法
【发布时间】:2014-01-23 19:14:01
【问题描述】:

假设我有一个简单的类

class Master {  
    public $variable;
    public function a_method() {
        // some code here
    }
}

以及覆盖父方法的子类

class Child extends Master {
    public function a_method() {
        // some other code
    }
}

现在,用$child_object = new Child() 实例化Child 类,如果我调用方法$child_object->a_method(),当然会执行被覆盖的代码。如果我有条件地希望调用父方法而不是子方法,这取决于(例如)$child_object->variable 的值,但仅在Master::a_method() 内表达条件怎么办?简单来说,我想要类似的东西

class Master {
    public $variable;
    public function a_method() {
        if ($this->variable) {
            // execute the child's method if you are in an inherited scope
        } else {
            // some code here
        }
    }
}

我知道在条件块内调用parent::a_method() 对孩子的方法采取行动是微不足道的,但我希望孩子的方法对该条件视而不见。

【问题讨论】:

  • 这听起来像是一个非常破碎的抽象。您正在尝试在父类中创建对子类的依赖,这不是一个好主意。 (父类应该不知道子类,更不用说对它的依赖了。)根据您要解决的问题,我想有一个解决它的模式。也许您希望工厂在另一个对象上提供父/子类型(在这种情况下应该是多态不可区分的),并且条件应该在 that 对象上?
  • 欺骗中的答案应该显示如何调用覆盖方法的父副本。
  • 为什么你觉得你只需要在Master::a_method内部表达条件?这可能很重要。
  • 因为我正在开发一个框架,这是为了便于配置。事实上,Master 类是在框架内部定义的,使用这个框架的人应该在不编写条件代码的情况下获得所需的行为(至少,这是我想要实现的)。

标签: php oop overriding


【解决方案1】:

您正在根据变量的值做两件不同的事情。我建议将这两个东西分成单独的方法,然后您不必担心名称重叠,您可以在子类中单独扩展每个方法。像这样的:

class Master
{
    public $var;
    public function method()
    {
        if ($this->var) {
            $this->trueMethod();
        } else {
            $this->falseMethod();
        }
    }
    protected function trueMethod() { }
    protected function falseMethod() { }
}

class Child extends Master
{
    protected function trueMethod()
    {
    }   
}

即,在您的情况下,当 $var 为 false 时,您永远不想运行子代码。因此,将 $var 为 false 时运行的代码拆分为自己的方法,并且不要在子进程中覆盖它。

【讨论】:

    猜你喜欢
    • 2012-09-19
    • 2011-04-24
    • 2012-12-03
    • 1970-01-01
    • 2019-12-21
    • 2021-12-07
    • 1970-01-01
    • 2023-02-04
    相关资源
    最近更新 更多