在Propel中为多个基类添加功能

时间:2011-08-19 11:43:36

标签: php inheritance symfony1 symfony-1.4 propel

我有一组模型对等类,它们都应具有相同的功能。我不是每次向组中添加新的复制和粘贴,而是将函数添加到模型对等类扩展的类中。不幸的是,由于模型对等类从基类(例如BaseModelPeer)扩展,因此不可能。

Propel 1.5添加了basePeer属性,允许您将BaseModelPeer设置为从给定的类扩展。但是,默认情况下,BaseModelPeer类不会从任何内容扩展。相反,它只是对BasePeer类进行所有调用,该类具有不同的函数签名。通过更改basePeer属性,BaseModelPeer来自您的新课程,我们称之为NewBasePeer,并将对BasePeer的调用更改为NewBasePeer。但是,由于签名不同,这只会导致它崩溃!

我实际上是试图从Symfony的Zend Lucene tutorial继续,将一些使得项目可索引的函数移动到这个NewBasePeer类。其中一项功能是doDeleteAll。 BaseModelPeer的这个函数的签名如下所示:

public static function doDeleteAll($con = null)

但是在这个函数中,它会像这样调用:

$affectedRows += BasePeer::doDeleteAll(ModelPeer::TABLE_NAME, $con, ModelPeer::DATABASE_NAME);

由于BaseModelPeer没有扩展BasePeer,所以没关系。但是通过更改架构中的basePeer属性,函数调用将更改为:

$affectedRows += NewBasePeer::doDeleteAll(ModelPeer::TABLE_NAME, $con, ModelPeer::DATABASE_NAME);

BaseModelPeer现在扩展NewBasePeer,意味着要覆盖对doDeleteAll()的调用,他们需要相同的签名。显然,BaseModelPeer类现在自相矛盾了!

这是Propel的错误吗?如果没有,那么如何使用basePeer属性?

1 个答案:

答案 0 :(得分:0)

  

我不是每次向组中添加新的复制和粘贴,而是将函数添加到模型对等类扩展的类中。

正确的方法是定义Propel Behavior