【问题标题】:PHP: "Declaration of ... should be compatible with that of ..."PHP:“...的声明应该与...的声明兼容”
【发布时间】:2012-10-31 20:48:24
【问题描述】:

我想为可 CRUD 的实体创建一个界面(可以保存和删除)。这是我的抽象类:

abstract class AbstractCrudableEntity extends AbstractEntity
{
    abstract public function doSave();
    abstract public function doDelete();
}

我的实现类需要为这些方法添加几个额外的参数。这是实现类的签名:

class Contact extends AbstractCrudableEntity {
    public function doSave(User $user, \UberClientManager $manager);
    public function doDelete(User $user, \UberClientManager $manager);
}

我了解 PHP 要求实现类具有与父类相同的方法参数(例如,有几个问题可以回答这个问题:this)。所以这不是问题。

但是,我最近在 Symfony 中遇到了一些处理身份验证令牌的代码。类 UsernamePasswordToken 扩展了 AbstractToken,并在 __construct() 方法中有一组不同的参数:AbstractToken::__construct()UsernamePasswordToken::__construct()

我的问题是 Symfony 是如何做到这一点的?这和我的代码有什么区别?

【问题讨论】:

    标签: php symfony


    【解决方案1】:

    重写构造函数是special case:

    与其他方法不同,当__construct() 被与父__construct() 方法不同的参数覆盖时,PHP 不会生成E_STRICT 级别的错误消息。

    你可以用其他方法做到这一点。

    【讨论】:

    • 哇,我想知道为什么构造函数是一个特例。似乎他们认识到这个功能很有用,但由于某种原因,它仅限于构造函数。
    • 呃,有人在 PHP 问题中发布该链接只是时间问题。
    • 就是那个链接的例子。很痛。
    【解决方案2】:

    您的子方法必须与抽象父类中的抽象方法具有相同数量的参数。

    您示例中的构造函数不是抽象的——孩子只是覆盖它。

    【讨论】:

    • 这没关系。实际上,我尝试将AbstractCrudableEntity 中的方法声明为非抽象方法,但仍然报错。
    猜你喜欢
    • 2011-04-30
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 2018-01-17
    • 2014-02-01
    • 1970-01-01
    相关资源
    最近更新 更多