我不太明白指出你要注入另一个类的类名的好处,比如
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传递给Too :: __ construct() 必须是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;
的语义也消失了,因为我现在正在$message
中阅读$Boo
。但是这$this->Foo->message;
说我正在$message
...
$Foo
这是PHP的一个缺陷吗?否则你会怎么解释?这种情况是否也发生在其他语言(如Java或Python)中?
答案 0 :(得分:5)
这将在所有语言中发生,因为它是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();
}
现在的概念是我要求哺乳动物,我不在乎它是人还是猫或其他任何东西,因为了解哺乳动物的实施方式并不是课堂的责任。
因此,要回答您的问题>>>>这不是一个错误,它是一个特征:)<<<<<<
答案 1 :(得分:3)
传入的类必须符合Foo的要求。如果Boo扩展了Foo,PHP认为Boo满足Foo的所有要求。并非所有语言都接受继承被调用类的类,但在PHP中也是如此。通常,人们将实现一个接口,并且该类可以接受任何实现该接口的类。这样,如果您确定原始类Foo已损坏,您可以将其替换为另一个实现相同接口的类。
如果你想传入Boo并且Boo与Foo没有任何关系,那么应该使用构造函数public function __construct(Boo $ Boo)来定义Too,否则你不会将它用于它的预期。
我希望有所帮助。