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知识中缺少一些非常重要的东西
非常感谢您的帮助
此错误消息引用liskov替换原则.它适用于每个IS-A关系(这是使用继承(extends)的含义)并声明每个子类型应该完全可替换为超类型.
但这不适用于构造函数!你正在使用哪个php版本?
似乎基类已将构造函数标记为抽象.这是出现此错误的唯一方法.
你永远不应该将构造函数标记为abstract,final或将它们放在接口中!
在大多数语言中,这甚至都不可能.
你应该从中得到的是,最佳实践是每个具体对象都有一个带有签名的构造函数,该签名最能代表消费者应该如何完全实例化该特定对象.在涉及继承的某些情况下,"借用"父项构造函数是可接受且有用的.此外,鼓励在子类化特定类型时,您的新类型在适当时应具有自己的构造函数,使其对新子类型最有意义.
http://ralphschindler.com/2012/03/09/php-constructor-best-practices-and-the-prototype-pattern
| 归档时间: |
|
| 查看次数: |
5221 次 |
| 最近记录: |