一个简单的例子:
class A
{
/**
* @var Injected
*/
private $injected;
public function __construct(Injected $injected)
{
$this->injected = $injected;
}
public function get()
{
$this->injected->e();
}
}
class B
{
/**
* @var Injected
*/
private $injected;
public function __construct(Injected $injected)
{
$this->injected = $injected;
}
public function get()
{
$this->injected->e();
}
}
class Injected
{
private $a;
public function __construct()
{
$this->a = mt_rand(1,9999999999);
echo 'Generated: '.$this->a.'<br>';
}
public function e()
{
echo $this->a.'<br>';
}
}
$o = new Injected();
$a = new A($o);
$b = new B($o);
$a->get();
$b->get();
$o = new Injected();
$a->get();
$b->get();
当我运行时:
Generated: 1223710791
1223710791
1223710791
Generated: 1135116298
1223710791
1223710791
这不正是我所期望的。前三个 1223710791 是正确的 - 但后两个似乎失败了。我想得到这个!
Generated: 1223710791
1223710791
1223710791
Generated: 1135116298
1135116298
1135116298
看起来即使我替换$o
它的引用也不会在A
和B
类中改变。为什么?如果它们是普通变量,那是可以理解的,但它们是对象,因此是引用!我什至没有克隆它们......这样就没有办法改变$injected
,除了二传手(这次不是一个选项)
您可以通过替换您的A
/B
类的构造函数来拥有这种(奇怪的,并且可能无法预测的)行为:
public function __construct(Injected &$injected)
{
$this->injected = &$injected;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句