7

我想澄清我遇到的问题

我有一个基本的 DataBase 类,它将被一堆其他类继承。构造函数如下所示:

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

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

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

我的问题是 php 不允许我在没有 $something 参数的情况下制作孩子的构造函数,我得到以下信息:

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

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

$pg = new planetsGames('uselessStringHereThatHasNoUtilityAtAll');

我想我在我的基本 php 知识中遗漏了一些非常重要的东西

非常感谢您提前提供的帮助

4

2 回答 2

5

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

但这不适用于构造函数!您使用的是哪个 php 版本?

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

您永远不应该将构造函数标记为抽象、最终或将它们放在接口中!

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

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

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

于 2013-03-17T10:52:32.443 回答
1

晚会晚了几年......

问题是您的构造函数需要一个值。您可以通过设置默认值(例如空字符串)来防止致命错误。

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

然后像平常一样实例化类

$pg = new planetsGames();
于 2021-07-30T16:19:42.667 回答