Php、DI、引用不按预期工作

约翰·史密斯

一个简单的例子:

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的引用也不会在AB类中改变为什么?如果它们是普通变量,那是可以理解的,但它们是对象,因此是引用!我什至没有克隆它们......这样就没有办法改变$injected,除了二传手(这次不是一个选项)

羽毛艺术

您可以通过替换您的A/B的构造函数来拥有这种(奇怪的,并且可能无法预测的)行为

public function __construct(Injected &$injected)
{
    $this->injected = &$injected;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章