向Propel中的多个基类添加功能


Adding Functionality to Multiple Base Classes in Propel

我有一组模型对等类,它们都应该具有相同的功能。我宁愿将函数添加到模型对等类扩展的类中,而不是每次向组中添加新函数时都将其复制并粘贴到每个类中。不幸的是,由于模型对等类是从基类(如BaseModelPeer(扩展而来的,所以这是不可能的。

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

实际上,我正试图学习Symfony的Zend-Lucene教程,将一些使项可索引的函数移到这个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属性?

我宁愿将函数添加到模型对等类扩展的类中,而不是每次向组中添加新函数时都将其复制并粘贴到每个类中。

正确的方法是定义推进行为