基于父方法的默认参数的扩展类(覆盖)方法的条件声明

时间:2013-04-22 13:06:12

标签: php inheritance joomla

我正在为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.

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分: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';
    }
}