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);
打印的值都是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);
这是为什么?
答:当你克隆时,你也在克隆参考。
$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
我希望这回答了你的问题
为什么你不能这样做:'$ A2 =新的A();'? – divix
@divix这不是一个实际的情况,而是一个简化的例子。 – user2180613
试试'$ a2 = $ a1'这个应该可以解决你简化的问题... – Lino