作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不太明白指明要注入(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/
我是一名优秀的程序员,十分优秀!