簡體   English   中英

PHP - 可捕獲的致命錯誤:傳遞給Too的參數1必須是Foo的實例,Boo的實例給出了嗎?

[英]PHP - Catchable fatal error: Argument 1 passed to Too must be an instance of Foo, instance of Boo given?

我不太明白指出你要注入另一個類的類名的好處,比如

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());

我會得到這個錯誤,

可捕獲的致命錯誤:傳遞給Too :: __ construct()的參數1必須是Foo的實例,給出的Boo實例,在C中調用:...

但如果我改變

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

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

我會得到正確的結果,沒有錯誤,

string 'boo' (length=3)

但是, Foo $Foo的意義或語義已經破裂。 因為我實際上正在通過$Boo

$this->Foo->message;的語義$this->Foo->message; 也因為我現在在$Boo閱讀$message而消失了。 但這個$this->Foo->message; 說我在$Foo閱讀$message

這是PHP的一個缺陷嗎? 否則你會怎么解釋? 這種情況是否也發生在其他語言(如Java或Python)中?

這將在所有語言中發生,因為它是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();
}

現在的概念是我要求哺乳動物,我不在乎它是人類還是貓或其他任何東西,因為了解哺乳動物的實施方式並不是課堂責任。

因此,回答你的問題>>>>這不是一個bug,它是一個功能:) <<<<<

傳入的類必須滿足Foo的要求。 如果Boo擴展了Foo,PHP認為Boo滿足Foo的所有要求。 並非所有語言都接受繼承被調用類的類,但在PHP中也是如此。 通常,人們將實現一個接口,並且該類可以接受任何實現該接口的類。 這樣,如果您確定原始類Foo已損壞,則可以將其替換為實現相同接口的另一個類。

如果你想傳入Boo並且Boo與Foo沒有任何關系,那么應該使用構造函數public function __construct(Boo $ Boo)來定義Too,否則你不會將它用於它的預期。

我希望有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 可捕獲的致命錯誤:傳遞給...的參數1必須是...,給定數組的實例 可捕獲的致命錯誤:傳遞給AppBundle \\ Form \\ TagType :: __ construct()的參數1必須是Doctrine \\ ORM \\ EntityRepository的實例,未給出任何實例, 可捕獲的致命錯誤:傳遞給Symfony :: render()的參數3必須是Symfony \\ .. \\ Response的實例,給定數組 Symfony 2嵌入式表單:可捕獲的致命錯誤:傳遞給Entity的參數1 :: addProperty必須是XX \\ MyClass的一個實例,給出的數組 可捕獲的致命錯誤:傳遞給Controller :: __ construct()的參數1必須是Doctrine \\ ORM \\ EntityManager的實例,未給出任何實例,稱為 可捕獲的致命錯誤:傳遞給getPrice()的參數1必須是Rectangle的實例,沒有給出 可捕獲的致命錯誤:傳遞給…的參數1必須是…的一個實例,為boolean給定,在…上在…中調用,並在…上在第在線 主義(Symfony3)可捕獲的致命錯誤:傳遞給(bundle)的參數1必須是(bundle)的實例,給定數組 可捕獲的致命錯誤:傳遞給 ...CsrfTokenManager::isTokenValid() 的參數 1 必須是 ...\CsrfToken 的實例,給定字符串 可捕獲的致命錯誤:傳遞給 Album\Controller\AlbumController::__construct() 的參數 1 必須是 Album\Model\AlbumTable 的實例,沒有給出
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM