PHP-Catchable致命错误:传递给Too的参数1必须是Foo的实例,给定的Boo的实例?
我不太明白指出将注入另一个类的类名的好处,例如PHP-Catchable致命错误:传递给Too的参数1必须是Foo的实例,给定的Boo的实例?,php,inheritance,Php,Inheritance,我不太明白指出将注入另一个类的类名的好处,例如 public function __construct(Foo $Foo) 在这种情况下,我可以看到它的好处 class Foo { public $message = 'foo'; } class Boo { public $message = 'boo'; } class Too { public function __construct(Foo $Foo) { $this->Foo
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());
我会得到这个错误
可捕获的致命错误:参数1传递给太::\u构造()
必须是Foo的实例,给定的Boo的实例,在C中调用:
但如果我改变
class Boo
{
public $message = 'boo';
}
到
我会得到正确的结果,没有错误
string 'boo' (length=3)
但是,Foo$Foo
的含义或语义已经崩溃。因为我实际上正在传递$Boo
$this->Foo->message的语义代码>也不见了,因为我现在正在阅读$Boo
中的$message
。但是这个$this->Foo->message代码>说我正在阅读$Foo
中的$message
这是PHP中的一个缺陷吗?否则你怎么解释?这在其他语言(如Java或Python)中也会发生吗?这在所有语言中都会发生,因为它是OOP的一部分。
它的实际使用将以a为例
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的所有要求。并非所有语言都会接受继承调用for类的类,但在PHP中也是如此。通常,人们会实现一个接口,而该类可以接受实现该接口的任何类。这样,如果您决定原来的类Foo被破坏,您可以用实现相同接口的另一个类替换它
如果您想传入Boo,而Boo与Foo没有任何关系,那么也应该使用构造函数公共函数_construct(Boo$Boo)来定义,否则您不会按照预期的方式使用它
我希望这会有帮助。啊,这是有道理的。所以$maleam->walk()
将在人类
或猫
中回显行走
?作为performWalk函数,您并不在乎。调用该函数的人有责任知道它需要传递给performWalk的实例
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();
}