PHP构造函数中的父/子类型提示?

4

不论我是否应该使用类型提示,有没有人可以告诉我如何避免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而不是比我更近的版本,则对不起打扰大家。


3
在这里测试你的代码:http://3v4l.org/。它会告诉你是否是版本问题。 - John Conde
也许如果你有一个接口,比如说“ImageInterface”,在这个接口中你有一个类“Image”实现了“ImageInterface”,那么你就可以用“ImageInterface”来暗示,而不是直接使用“Image”。 - Sarel
2
我按照 @JohnConde 的建议使用了 3v4l.org,它对我很有效:http://3v4l.org/30dkZ(适用于所有 PHP 5.x 版本)。 - gd1
2
这不应该是这样的。类的类型提示明确允许该类的子类型,这是面向对象编程的核心思想之一。要么你在旧版本中发现了一个晦涩的错误,要么你没有正确地测试(打错字了?)。 - deceze
1
感谢大家的评论 - 我本以为这是错误的,但我不确定。我去尝试了你建议的网站中的完整代码,发现facepalm Image扩展了Reference,Product扩展了Reference,Headed扩展了Product……所以我需要为Reference(祖父类)进行类型提示。对于造成的麻烦非常抱歉,再次感谢大家帮助我澄清了这一点! - Sarah Kemp
如果使用命名空间,请确保提供了正确的“use”路径。我也遇到过这个问题,后来才意识到我一直在移动我的类。 - xorinzor
1个回答

0

使用 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" } 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接