2013-04-22 92 views
0

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

例如(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; 
    } 
} 

很显然,我不能直接编辑0​​及其方法。

编辑:这里是确切的错误信息:

Strict standards: Declaration of Extending::prepareTable() should be compatible with Base::prepareTable($table) in. 
+0

我会保持'函数prepareTable(&$表){'(参考),但只改变$表如果CMS_VERSION是 '1.0'。也就是说'$ temp = $ table;'(copy)并在离开函数之前if(CMS_VERSION =='1.0')$ table = $ temp;' – Waygood 2013-04-22 13:23:29

+0

你能否精心策划。 CMS版本1.1中的基类方法将默认参数声明为仅值'$ table',如果我使用您的解决方案并将默认值作为引用保留扩展类方法,则显示STRICT PHP警告。 – 2013-04-22 13:29:05

+0

啊!你有2个不同的基类。 v1是prepareTable(&$ table),v1.1是prepareTable($ table)。它是否正确? – Waygood 2013-04-22 13:31:25

回答

2

我认为实现这一目标,而不用复制里面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; 
    } 
} 
+0

有没有办法避免完全重复'Base2'类,因为里面还有很多其他方法和属性? – 2013-04-22 14:22:08

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'; 
    } 
} 
+0

你真的应该接受@Waygood的答案,因为你基本上只是复制了他的。 – NSAddict 2015-11-24 10:03:09

+0

请随时打开以获得反馈。只是切换了接受的答案。感谢您指出您发现更有价值的答案。 – 2015-11-24 17:00:24

+0

这很体贴,谢谢! – NSAddict 2015-11-24 19:38:39