PHP-Catchable致命错误:传递给Too的参数1必须是Foo的实例,给定的Boo的实例?

PHP-Catchable致命错误:传递给Too的参数1必须是Foo的实例,给定的Boo的实例?,php,inheritance,Php,Inheritance,我不太明白指出将注入另一个类的类名的好处,例如 public function __construct(Foo $Foo) 在这种情况下,我可以看到它的好处 class Foo { public $message = 'foo'; } class Boo { public $message = 'boo'; } class Too { public function __construct(Foo $Foo) { $this->Foo

我不太明白指出将注入另一个类的类名的好处,例如

public function __construct(Foo $Foo)
在这种情况下,我可以看到它的好处

class Foo
{
    public $message = 'foo';
}

class Boo 
{
    public $message = 'boo';
}

class Too
{
    public function __construct(Foo $Foo)
    {
        $this->Foo = $Foo;
    }

    public function fetch()
    {
        return $this->Foo->message;
    }
}

$Too = new Too(new Boo);
var_dump($Too->fetch());
我会得到这个错误

可捕获的致命错误:参数1传递给太::\u构造() 必须是Foo的实例,给定的Boo的实例,在C中调用:

但如果我改变

class Boo
{
    public $message = 'boo';
}

我会得到正确的结果,没有错误

string 'boo' (length=3)
但是,
Foo$Foo
的含义或语义已经崩溃。因为我实际上正在传递
$Boo

$this->Foo->message的语义也不见了,因为我现在正在阅读
$Boo
中的
$message
。但是这个
$this->Foo->message说我正在阅读
$Foo
中的
$message


这是PHP中的一个缺陷吗?否则你怎么解释?这在其他语言(如Java或Python)中也会发生吗?

这在所有语言中都会发生,因为它是OOP的一部分。 它的实际使用将以a为例

interface Mammal
{
    public function walk();
}

class Human implements Mammal
{
    public function walk()
    {
        echo 'Walk using two legs or whatever';
    }
}

class Cat implements Mammal
{
    public function walk()
    {
        echo 'Walk using four legs or whatever';
    }
}

function performWalk(Mammal $mammal){
   $mammal->walk();
}
现在的概念是,我要求一个哺乳动物,我不在乎它是人还是猫或其他任何东西,因为知道这个哺乳动物有什么样的实现不是类的责任


因此,要回答您的问题>>>它不是一个bug,而是一个特性:)传入的类必须满足Foo的要求。如果Boo扩展了Foo,那么PHP认为Boo满足了Foo的所有要求。并非所有语言都会接受继承调用for类的类,但在PHP中也是如此。通常,人们会实现一个接口,而该类可以接受实现该接口的任何类。这样,如果您决定原来的类Foo被破坏,您可以用实现相同接口的另一个类替换它

如果您想传入Boo,而Boo与Foo没有任何关系,那么也应该使用构造函数公共函数_construct(Boo$Boo)来定义,否则您不会按照预期的方式使用它


我希望这会有帮助。

啊,这是有道理的。所以
$maleam->walk()
将在
人类
中回显
行走
?作为performWalk函数,您并不在乎。调用该函数的人有责任知道它需要传递给performWalk的实例
interface Mammal
{
    public function walk();
}

class Human implements Mammal
{
    public function walk()
    {
        echo 'Walk using two legs or whatever';
    }
}

class Cat implements Mammal
{
    public function walk()
    {
        echo 'Walk using four legs or whatever';
    }
}

function performWalk(Mammal $mammal){
   $mammal->walk();
}