我不太明白指示类的名称,你会注入另一个类,如的好处,PHP - 可捕捉的致命错误:传递给Too的参数1必须是Foo的实例,Boo的实例给出了吗?
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());
我会得到这个错误,
Catchable fatal error: Argument 1 passed to Too::__construct() must be an instance of Foo, instance of Boo given, called in C:...
但是,如果我改变
class Boo
{
public $message = 'boo';
}
到
class Boo extends Foo
{
public $message = 'boo';
}
我会得到正确的结果,如果没有错误,
string 'boo' (length=3)
但是,意义或语义的Foo $Foo
已经崩溃。因为我实际上是通过$Boo
。
$this->Foo->message;
的语义也不存在了,因为我现在正在阅读$message
的$Boo
。但是这个$this->Foo->message;
说我在读$message
在$Foo
...
这是PHP的缺陷吗?否则,你会如何解释?这是否也发生在其他语言(如Java或Python)?
Aww,这是有道理的。所以'$ mammal-> walk();'会在'Human'或'Cat'中回应'walk'吗? – laukok
作为一个预约功能,你并不在乎。谁打电话给那个功能的人有责任知道它需要传递什么样的实例 –
明白了!非常感谢你! :) – laukok