2012-10-31 101 views
4

我想创建一个CRUDable(可以保存和删除)实体的界面。这里是我的抽象类:PHP:“...的声明应该与...兼容”

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

回答

8

重写构造是一个special case

不同于用其它方法,PHP不会当__construct()与不同的参数比母体__construct()方法具有覆盖产生E_STRICT级别的错误消息。

你可以不是这样做与其他方法。

+0

哇,我不知道为什么构造函数是一个特例。看起来他们认识到这个功能是有用的,但由于某种原因,它仅限于构造函数。 – theunraveler

+1

[欢迎来到美丽的PHP世界](http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/)。 ;) –

+1

呃,有人在PHP问题中发布该链接只是时间问题。 – theunraveler

0

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

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

+0

这没关系。实际上,我试图在'AbstractCrudableEntity'中声明方法不抽象,并且仍然有错误。 – theunraveler

相关问题