无法声明在超类接口中声明的子类方法

时间:2011-05-26 23:52:19

标签: php inheritance interface propel overloading

这应该是一个非常简单的类和接口问题,但请在我列出我的例子时请耐心等待。

在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);
    }

2 个答案:

答案 0 :(得分:1)

此代码有效。问题必须是服务器副本或PHP版本。 (我在PHP版本5.3.3-7 + squeeze1上运行测试没有问题)

答案 1 :(得分:1)

我已经开始了另一个简单的测试。使用你的代码,但有两个回声,它的工作原理。就像在C中一样,在这种情况下,接口充当原型,正如您所说,它需要与它实现的类相同的参数和可见性。