gpt4 book ai didi

PHP - 给定 Boo 的可捕获 fatal error : Argument 1 passed to Too must be an instance of Foo, 实例?

转载 作者:行者123 更新时间:2023-12-02 06:57:50 25 4
gpt4 key购买 nike

我不太明白指明要注入(inject)到另一个类中的类名的好处,例如,

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; 的语义也消失了,因为我现在正在阅读 $Boo 中的 $message。但是这个 $this->Foo->message; 说我正在阅读 $Foo 中的 $message...

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

最佳答案

这将在所有语言中发生,因为它是 OOP 的一部分。它的实际用途是 strategy pattern举个例子。

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

现在的概念是,我要求一个 Mammal,我不在乎它是人类、猫还是其他任何东西,因为知道 Mammal 有什么样的实现不是类的责任。

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

关于PHP - 给定 Boo 的可捕获 fatal error : Argument 1 passed to Too must be an instance of Foo, 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27641082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com