2015-12-01 15 views
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); 
+0

为什么你不能这样做:'$ A2 =新的A();'? – divix

+2

@divix这不是一个实际的情况,而是一个简化的例子。 – user2180613

+0

试试'$ a2 = $ a1'这个应该可以解决你简化的问题... – Lino

回答

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 

我希望这回答了你的问题

相关问题