这应该是一个非常简单的类和接口问题,但请在我列出我的例子时请耐心等待。
在Propel ORM库中,所有数据库表都被抽象为名为BaseTablename
的类。在基础对象中定义了用于与数据库交互的各种方法。然后,库还会生成以表格命名的类,例如Tablename
,它们可以非常方便地覆盖基本方法并添加自定义方法。
我只是想覆盖默认的delete()
方法,以便能够删除一些相关数据。但是,当我声明重写方法时,我收到以下错误:
致命错误:Tablename :: delete()的声明必须与Persistent :: delete()的声明兼容
因此,考虑到以下基本定义,为什么我无法覆盖delete()
方法?
/**
* Part of the Propel library
*/
interface Persistent {
public function delete (PropelPDO $con = null);
}
/**
* Generated by Propel
*/
class BaseTablename extends BaseObject implements Persistent {
public function delete (PropelPDO $con = null) {
doesImportantStuff();
}
}
/**
* Skeleton class is generated by Propel
*/
class Tablename extends BaseTablename {
/**
* MY OWN BEAUTIFUL [BUT BROKEN] CODE
*/
public function delete (PropelPDO $con = null) {
doMyOwnStuff();
// Added this 2011-05-30 -- As it happens, this IS the Problem!
// I needed to add the $con parameter to the call to preserve
// the "chain of compatibility", so to speak.
parent::delete();
}
}
更新:我添加了我的parent :: delete()调用,但我没有将其包含在原始示例代码中。它真的会有所不同。对不起,非常感谢那些确认工作代码的人
答案是我需要在所有声明和调用上保留参数。我的重载函数应该是:
public function delete (PropelPDO $con = null) {
doMyOwnStuff();
parent::delete($con);
}
答案 0 :(得分:1)
此代码有效。问题必须是服务器副本或PHP版本。 (我在PHP版本5.3.3-7 + squeeze1上运行测试没有问题)
答案 1 :(得分:1)
我已经开始了另一个简单的测试。使用你的代码,但有两个回声,它的工作原理。就像在C中一样,在这种情况下,接口充当原型,正如您所说,它需要与它实现的类相同的参数和可见性。