php对象的拷贝原理
首先,先定义一个类;
1 class Dog{ 2 public $name; 3 public $age; 4 }
$dog = new Dog();
1>
直接复制拷贝
$dog2 = $dog;
1 $dog = new Dog(); 2 $dog2 = $dog; 3 $dog->name = "yellow"; 4 $dog->age = '18'; 5 var_dump($dog,$dog2); 6 echo "<br/>".$dog2->name."<br/>"; 7 $dog->name = "black"; 8 echo $dog2->name."<br/>";
运行结果:
可以看出,$dog,$dog2的对象标识符是一样的。 直接赋值的这种拷贝只是 拷贝了 对象标识符的一个副本而已,但是对象标识符的数据指向并没有改变,都是指向同一块数据块。
2>
引用复制拷贝(赋值引用)
$dog2 = &$dog;
1 $dog = new Dog(); 2 $dog->name = "yellow"; 3 $dog->age = '18'; 4 $dog2 = &$dog; 5 var_dump($dog,$dog2); 6 $dog2 = "abc"; 7 echo $dog->name;//此时,$dog变成一个字符串,不再是对象了。 8 echo $dog2."<br/>";//输出:abc
引用标识符都是一致的,但是$dog2改变了他们的共同指向,使对象标识符变成了字符串"abc",那么此时此标识符不再是对象标识符,而是一个字符串,则echo $dog->name就会报错,echo $dog2就会输出 "abc";
3>克隆拷贝
$dog2 = clone $dog;
1 $dog = new Dog(); 2 $dog->name = "yellow"; 3 $dog->age = '18'; 4 $dog2 = clone $dog; 5 var_dump($dog,$dog2); 6 echo $dog->name."<br/>"; 7 $dog->name = "black"; 8 echo $dog->name."<br/>"; 9 echo $dog2->name."<br/>";
输出结果如下:
两者的对象标识符是不同的,这就意味着指向的数据块也是不用的,此时输出$dog->name以及改变$dog->name都不会影响$dog2的数据。