【问题标题】:Parent/child type hinting in php constructor? [closed]php构造函数中的父/子类型提示? [关闭]
【发布时间】: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


【解决方案1】:

使用php 5.4.3

我运行这段代码

<?php

class Image {
public $a="s";
};

class Headed extends Image { };

class Dimension {
    function __construct(Image $image) 
    {
        var_dump($image);
    }
};

$h = new Headed;
$d = new Dimension($h);

?>

输出:

object(Headed)#1 (1) { ["a"]=> string(1) "s" } 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    • 1970-01-01
    • 2018-02-28
    相关资源
    最近更新 更多