php构造函数继承

use*_*302 7 php inheritance constructor

我想澄清一下我遇到的问题

我有一个基础DataBase类,将由许多其他类继承.构造函数如下所示:

public function __construct ($table)
{
     $this->table = $table;
     $this->db = new Database();
     $this->db->connect();
}
Run Code Online (Sandbox Code Playgroud)

我会从这个构造函数中调用来自以下的子代:

 public function __construct ($something)
{
    parent::__construct("planets_games");
}
Run Code Online (Sandbox Code Playgroud)

我的问题是php不允许我在没有$ something参数的情况下创建孩子的构造函数,我得到以下内容:

 Fatal error: Declaration of planetsGames::__construct() must be compatible with that of IScaffold::__construct()
Run Code Online (Sandbox Code Playgroud)

我目前通过实例化这样的对象来绕过这个:

$pg = new planetsGames('uselessStringHereThatHasNoUtilityAtAll');
Run Code Online (Sandbox Code Playgroud)

我想我在基本的PHP知识中缺少一些非常重要的东西

非常感谢您的帮助

Seb*_*ler 5

此错误消息引用liskov替换原则.它适用于每个IS-A关系(这是使用继承(extends)的含义)并声明每个子类型应该完全可替换为超类型.

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

似乎基类已将构造函数标记为抽象.这是出现此错误的唯一方法.

你永远不应该将构造函数标记为abstract,final或将它们放在接口中!

在大多数语言中,这甚至都不可能.

你应该从中得到的是,最佳实践是每个具体对象都有一个带有签名的构造函数,该签名最能代表消费者应该如何完全实例化该特定对象.在涉及继承的某些情况下,"借用"父项构造函数是可接受且有用的.此外,鼓励在子类化特定类型时,您的新类型在适当时应具有自己的构造函数,使其对新子类型最有意义.

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