【问题标题】:Extends in PHP not working when method in Base class tries to invoke a method which is implemented only in extended class当基类中的方法尝试调用仅在扩展类中实现的方法时,PHP 中的扩展不起作用
【发布时间】:2015-08-27 06:13:12
【问题描述】:

我正在尝试在 PHP 中使用扩展设计模式。思路是从基类中扩展一些方法,调用的方法只能由扩展类实现,如下:

class BaseClass {

    function process() {
       $tableName = self::getTable();
       // Do some processing using $tableName returned
    }

}

class ExtendedClassA extends BaseClass {

    function getTable() {
        return "Table_A";
    }
}

问题是当我尝试创建一个ExtendedClassA的实例并调用流程函数时,上面的代码会产生一个错误,它会说:

PHP 致命错误:调用未定义的方法 BaseClass::getTableName()

任何线索我做错了什么?

【问题讨论】:

    标签: php


    【解决方案1】:

    BaseClass 中实现getTable。使其为空或抽象。也使用$this 而不是self

    可能BaseClass 应该是一个抽象类,因为你不能直接使用它:

        abstract class BaseClass {
    
            function process() {
               $tableName = $this->getTable();
               // Do some processing using $tableName returned
            }
    
            abstract function getTable();
    
        }
    
    class ExtendedClassA extends BaseClass {
    
        function getTable() {
            return "Table_A";
        }
    }
    

    【讨论】:

    • 现在说 ExtendedClassA 包含 1 个抽象方法,因此必须声明为抽象方法或实现其余方法
    • 不要在ExtendedClassA 函数之前使用abstract
    • 谢谢 Mantas,我没有,一些愚蠢的错字,我使用了不同的方法名称,它现在可以工作了。 +1 超级快速回复。
    【解决方案2】:

    要调用self::getTable(),getTable 必须是BaseClass 的静态方法,因为self 总是绑定到定义当前方法的类。

    如果要调用当前调用类的静态方法,请改用static::getTable()。这称为late static binding,即static 在运行时绑定到类。

    另外,把function getTable()改成static function getTable(),否则会报错(取决于你的PHP版本和错误严格性)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 2015-03-09
      相关资源
      最近更新 更多