【问题标题】:Adding Functionality to Multiple Base Classes in Propel向 Propel 中的多个基类添加功能
【发布时间】:2011-08-19 11:43:35
【问题描述】:

我有一组模型对等类,它们都应该具有相同的功能。我宁愿将函数添加到模型对等类扩展的类中,而不是每次向组中添加新函数时都复制和粘贴。不幸的是,由于模型对等类是从 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 属性?

【问题讨论】:

    标签: php inheritance symfony1 symfony-1.4 propel


    【解决方案1】:

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

    正确的方法是定义一个Propel Behavior

    【讨论】:

      猜你喜欢
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 2012-01-04
      • 2012-10-22
      • 1970-01-01
      • 2015-07-15
      相关资源
      最近更新 更多