我正在为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';
}
}