为什么一个引用可以引用多个变量?

3
打印出的值都是11和12,为什么会这样呢?有没有办法去掉克隆对象的引用?
class A {
    public $z = 10;
}

$a1 = new A();

$z = &$a1->z;

$a2 = clone $a1;

$a1->z = 11;

var_dump($z);

$a2->z = 12;

var_dump($z);

为什么你不能这样做:$a2 = new A(); - divix
2
@divix 这不是实际情况,而是一个简化的例子。 - user2180613
尝试使用 $a2 = $a1 来解决你的简化问题... - Lino
1
可能是 https://dev59.com/lG855IYBdhLWcg3w1n88 的重复问题。 - Victor Radu
1个回答

0
为什么会这样呢?
答:当你克隆时,也会克隆引用。
$z = &Ref to $a1->z [0x000F]

$a2-z = [0x000F]

$a1->z = 11; //[0x000F] = 11;

由于两个类实例引用相同的内存,当您更改 $z 时,它会更改两个类的值。

取消引用该值的唯一方法是将其取消设置。

unset($a2->z);
$a2->z = 12;

这是一个完整的例子。

class A {
    public $z = 10;
}

$a1 = new A();

$z = &$a1->z;

$a2 = clone $a1;

$a3 = clone $a2;

$a1->z = 11;

var_dump($z);

$a2->z = 12;

var_dump($z);

unset($a3->z);
$a3->z = 13;
var_dump($z);
var_dump($a3->z);

输出结果为

int(11)
int(12)
int(12) //$z
int(13) //$a3->z So $a3->z is now unlinked from the Unset

我希望这回答了你的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接