基于父方法的扩展类(重写)方法的条件声明';s默认参数


Conditional Declaring of Extending Class (Overwriting) Method, Based on the Parent Method's Default Parameters

我正在为CMS创建一个插件,该插件提供了一些基类(假设其中一个类称为Base(。这个类有一些必须在扩展类中覆盖的辅助方法。我们应该注意,基本方法提供了默认的参数/值。在LMS的一个版本中,这些值在下一版本中通过参考仅按值提供。

例如(CMS v1.0(:

function prepareTable(&$table){...

CMS v1.1:

function prepareTable($table){...

当您扩展Base类并覆盖prepareTable方法时,您还必须使用相同的默认参数/值来声明它,否则将显示STRICT PHP警告(在PHP 5.4中默认为打开(

我的问题是,在知道父CMS的版本的情况下,如何以有效的方式有条件地覆盖父类中的方法?

以下是我目前拥有的(目前没有工作(:

class Base{
    function prepareTable(&$table){
    }
}
class Extending extends Base{
    if(CMS_VERSION=='1.0')
      function prepareTable(&$table){
    else
      function prepareTable($table){
       echo $table;
    }
}

显然,我不能直接编辑Base及其方法。

编辑:这是确切的错误消息:

Strict standards: Declaration of Extending::prepareTable() should be compatible with Base::prepareTable($table) in.

在不复制prepareTable内部代码的情况下实现这一目标的唯一方法是创建一个在prepareTable中调用的伪函数,然后在最后的扩展类中声明

if(CMS_VERSION=='1.0') {
    class Base2 extends Base{
        function prepareTable(&$table){
            return $this->prepareTable2($table);
        }
        function prepareTable2(&$table){
        }
    }
} else {
    class Base2 extends Base{
        function prepareTable($table){
            return $this->prepareTable2($table);
        }
        function prepareTable2(&$table){
        }
    }
}
class Extending extends Base2{
    function prepareTable2(&$table){
            echo $table;
    }
}
if(CMS_VERSION=='1.0') {
    class Extending extends Base{
        function prepareTable(&$table){
        }
    }
} else {
    class Extending extends Base{
        function prepareTable($table){
        }
    }
}

请注意,if/else检查必须在定义类之前完成,而不是在类内部。从本质上讲,您正在构建两个不同版本的类。

旁注:如果您需要包括共享方法,这在类的两个版本之间不会改变,您可以定义一个新的类来扩展Extending,在那里创建共享方法并使用这个新类。

例如(将其放在上面的代码后面(:

class ExtendingFull extends Extending{
    // Here you may include your shared methods
    // e.g:
    public function sharedMethod(){
       echo 'test';
    }
}