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