0

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

例如(CMS v1.0):

function prepareTable(&$table){...

内容管理系统 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.
4

2 回答 2

3

在不复制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;
    }
}
于 2013-04-22T13:45:24.903 回答
0
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';
    }
}
于 2013-05-02T10:47:24.507 回答