【发布时间】:2013-01-29 09:40:58
【问题描述】:
在不考虑是否应该使用类型提示的情况下,谁能告诉我,当我将子类传递给为父类提示类型提示的构造函数时,是否有办法避免 PHP 抛出错误?例如:
class Headed extends Image { ... }
class Dimension {
function __construct(Image $image, $arg1, $arg2){ ... }
}
PHP 给了我:
PHP Error 4096: Argument 1 passed to Dimension::__construct() must be an instance of Image, instance of Headed given
Headed 类型的对象显然也是一个 Image,因为它是一个子类,是否有某种方式来表达我的构造函数,以便它提供类型提示但允许子类?
如果这是因为我使用 PHP 5.2.5 而不是更新的版本,我很抱歉打扰大家。
【问题讨论】:
-
在这里测试您的代码:3v4l.org。它会告诉你是否是版本问题。
-
也许如果你有一个接口,说“ImageInterface”,你有类 Image 实现 ImageInterface,这样你用 Image 而不是用 ImageInterface 提示?
-
我像@JohnConde 建议的那样使用了 3v4l.org,它对我有用:3v4l.org/30dkZ(在所有 PHP 5.x 版本上)
-
不应该这样。类的类型提示也明确允许该类的子类型,这是 OOP 的核心思想之一。要么您在旧版本中发现了一个晦涩的错误,要么您没有正确测试它(错字?)。
-
感谢大家的 cmets - 我认为这是错误的,但我不确定。我去您建议的站点中尝试了我的完整代码,发现 facepalm Image extends Reference, Product extends Reference, and Headed extends Product... 所以我需要为 Reference 输入提示(祖父类) .很抱歉给我带来了麻烦,谢谢大家帮我解决问题!
标签: php oop inheritance php-5.2