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

Php 基于父方法的扩展类(覆盖)方法的条件声明';s的默认参数,php,inheritance,joomla,Php,Inheritance,Joomla,我正在为CMS创建一个插件,它提供了一些基类(比如说其中一个类叫做base)。这个类有几个助手方法,必须在扩展类中覆盖这些方法。我们应该注意,基本方法提供了默认参数/值。在LMS的一个版本中,这些值在下一个版本中仅通过值通过引用提供 例如(CMS v1.0): CMS v1.1: function prepareTable($table){... 当您扩展Base类并覆盖prepareTable方法时,您还必须使用相同的默认参数/值声明它,否则会显示一个严格的PHP警告(在PHP5.4中默认为

我正在为CMS创建一个插件,它提供了一些基类(比如说其中一个类叫做
base
)。这个类有几个助手方法,必须在扩展类中覆盖这些方法。我们应该注意,基本方法提供了默认参数/值。在LMS的一个版本中,这些值在下一个版本中仅通过值通过引用提供

例如(CMS v1.0):

CMS v1.1:

function prepareTable($table){...
当您扩展
Base
类并覆盖
prepareTable
方法时,您还必须使用相同的默认参数/值声明它,否则会显示一个严格的PHP警告(在PHP5.4中默认为on)

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

以下是我目前的情况(目前不工作):

显然,我不能直接编辑
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;
    }
}

在不复制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/else
检查必须在定义类之前完成,而不是在类内部。本质上,您正在构建该类的两个不同版本

旁注:如果您需要包含共享方法(在类的两个版本之间不会更改),则可以定义一个新类,该类将扩展
扩展
,在那里创建共享方法并使用此新类

例如(将其置于上述代码之后):

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

旁注:如果您需要包含共享方法(在类的两个版本之间不会更改),则可以定义一个新类,该类将扩展
扩展
,在那里创建共享方法并使用此新类

例如(将其置于上述代码之后):


我会保留
函数prepareTable(&$table){
(参考),但只有在CMS\u版本为“1.0”时才更改$table。即
$temp=$table;
(复制),在离开函数
之前,如果(CMS\u版本=='1.0')$table=$temp;
你能解释一下吗。CMS版本1.1中的基类`method声明默认参数为value only
$table
,如果我使用你的解决方案并将扩展类`method保留一个默认值作为参考,会显示严格的PHP警告。啊!你有两个不同的基类。v1是prepareTable(&$table)和v1.1是prepareTable($table)。这正确吗?是的,但不是同时。v1有一个带有引用(
&$table
),v1.1有一个没有引用。我在这里看到的唯一方法是有条件地定义父prepareTable()方法。否则,您总是会遇到此错误,因为声明不一样。我将保持
函数prepareTable(&$table){
(参考),但仅在CMS_版本为“1.0”时更改$table。即
$temp=$table;
(复制)并在离开函数之前
if(CMS_版本=='1.0')$table=$temp;
你能解释一下吗。CMS版本1.1中的基类`method声明默认参数为value only
$table
,如果我使用你的解决方案并将扩展类`method保留一个默认值作为参考,会显示严格的PHP警告。啊!你有两个不同的基类。v1是prepareTable(&$table)和v1.1是prepareTable($table)。这正确吗?是的,但不是同时。v1有一个带有引用(
&$table
),v1.1有一个没有引用。我在这里看到的唯一方法是有条件地定义父prepareTable()方法。否则,您总是会遇到此错误,因为声明不同。有没有办法避免完全复制
Base2
类,因为其中还有大量其他方法和属性?有没有办法避免完全复制
Base2
类,因为里面还有很多其他的方法和属性?你真的应该接受@Waygood的答案,因为你基本上只是复制了他的答案。始终开放以获取反馈。只是切换了接受的答案。感谢你指出你觉得更有价值的答案。你真的应该接受@Waygood的答案,因为你基本上就是这样ally刚刚复制了他的答案。随时欢迎反馈。只需切换已接受的答案。感谢您指出您认为更有价值的答案。
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){

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