繁体   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