从父母调用子函数

时间:2014-03-09 13:39:37

标签: php oop

在子类中调用方法的最佳方法是什么。如果我尝试直接调用该方法,我的IDE总会显示错误。

    class Base
    {
        public function DoIt()
        {
            $this->Generate(); //How to check if child implements Generate?
        }
    }

    class Child extends Base
    {
       protected function Generate()
       {
            echo "Hi";
       }
    }

2 个答案:

答案 0 :(得分:3)

简单地说,你不这样做。这是非常糟糕的设计:除了实现基础本身定义的契约之外,基类不应该假设任何有关其后代的内容。

最接近的可接受替代方法是在父节点上声明abstract protected function Generate(),以便它知道所有派生类都实现它。当然,这并不是一个机械解决方案:只有Generate对{em>所有后代Base有意义时才应该这样做。

答案 1 :(得分:3)

问题是您的父类没有定义子类可以覆盖的Generate()方法;你必须通过创建一个抽象方法来明确定义它:

// class with at least one abstract method is 
abstract class Base
{
    public function DoIt()
    {
        $this->Generate();
    }

    // child classes MUST implement this method
    abstract protected function Generate();
}

您可以通过在父类中创建一个空实现来放松要求:

class Base
{
    public function DoIt()
    {
        $this->Generate();
    }

    // child classes MAY implement this method
    protected function Generate() {}
}