PHP:“......的声明应与......的声明兼容”

时间:2012-10-31 12:44:11

标签: php symfony

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

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是如何做到这一点的?这与我的代码有什么区别?

2 个答案:

答案 0 :(得分:8)

重写构造函数是special case

  

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

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

答案 1 :(得分:0)

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

你的例子中的构造函数不是抽象的 - 孩子只是覆盖它。