PHP - 可捕获的致命错误:传递给Too的参数1必须是Foo的实例,Boo的实例给出了吗?

lau*_*kok 2 php inheritance

我不太明白指出你要注入另一个类的类名的好处,比如

public function __construct(Foo $Foo)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我可以看到它的好处,

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());
Run Code Online (Sandbox Code Playgroud)

我会得到这个错误,

可捕获的致命错误:传递给Too :: __ construct()的参数1必须是Foo的实例,给出的Boo实例,在C中调用:...

但如果我改变

class Boo
{
    public $message = 'boo';
}
Run Code Online (Sandbox Code Playgroud)

class Boo extends Foo
{
    public $message = 'boo';
}
Run Code Online (Sandbox Code Playgroud)

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

string 'boo' (length=3)
Run Code Online (Sandbox Code Playgroud)

但是,意义或语义Foo $Foo已经破裂.因为我$Boo实际上在路过

语义的$this->Foo->message;消失过,因为我读$message$Boo现在.但这种$this->Foo->message;说法我读$message$Foo...

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

mam*_*dan 5

这将在所有语言中发生,因为它是OOP的一部分.实际使用它将以策略模式为例.

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();
}
Run Code Online (Sandbox Code Playgroud)

现在的概念是我要求哺乳动物,我不在乎它是人还是猫或其他任何东西,因为知道哺乳动物的实施方式不是阶级责任.

因此,回答你的问题>>>>这不是一个bug,它是一个功能:) <<<<<