2013-03-17 124 views
6

我要澄清我有PHP构造继承

一个问题,我有一个会被很多其他的classes.The构造继承基础数据库类看起来是这样的:

public function __construct ($table) 
{ 
    $this->table = $table; 
    $this->db = new Database(); 
    $this->db->connect(); 
} 

我如下会从孩子这个构造函数中调用:

public function __construct ($something) 
{ 
    parent::__construct("planets_games"); 
} 

我的问题是,PHP不请允许我孩子的构造没有$什么参数 我得到如下:

$pg = new planetsGames('uselessStringHereThatHasNoUtilityAtAll'); 

我觉得我失去了一些东西在我的基本的PHP知识

谢谢非常重要:

Fatal error: Declaration of planetsGames::__construct() must be compatible with that of IScaffold::__construct() 

我目前通过实例化一个像这样的对象绕过这你非常需要提前帮忙

+0

是PHP目前是严格了,子类的结构参数必须是该父兼容。你没有得到什么?你不能做那样的事情,但是,你可以没有任何争论的父母和孩子,而只是从孩子的构念向父母传递论据。这是你想要的吗? – 2013-03-17 10:50:18

回答

5

这个错误信息是指liskov substitution principle。 它适用于每个IS-A关系(这是使用继承(扩展)的含义),并指出每个子类型应该完全可以替换超类型。

但这并不适用于构造函数!你正在使用哪个PHP版本?

看来基类已将构造函数标记为抽象。这是唯一可以出现 这个错误的方法。

你不应该标记构造函数抽象,最终或把它们放在接口!

在大多数语言中,这是不可能的。

由这是最好的做法是,每个 具体对象与最能代表 如何消费者应该充分实例化特定 对象的签名的构造函数,你应该采取什么样的了。在涉及继承的某些情况下,“借用”父母构造函数是可以接受和有用的。此外, 鼓励当您为某个特定类型创建子类时,您的新 类型应该在适当的情况下具有自己的构造函数,以使 对新子类型最有意义。

http://ralphschindler.com/2012/03/09/php-constructor-best-practices-and-the-prototype-pattern

+0

对不起,延迟reply.I使用版本5.3.13 – user1840302 2013-03-17 11:38:25

+0

只有当我们谈论多态时LSP不适合吗?我最初的想法是一样的,但它是一个构造函数,而不是一个常规方法。我们没有施工人员的合同,是吗? – zerkms 2013-03-17 20:19:29

+0

不,但在PHP中,您可以标记构造函数为抽象。我想在一个超级课堂(IScaffold?)在上面的例子中是这样,否则致命不会发生。使构造函数抽象带来与LSP相同的约束。我认为这是不好的做法,正如我上面所述。 – 2013-03-18 06:54:37