我不太明白指示類的名稱,你會注入另一個類,如的好處,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