在php5 的对象编程经常提到“默认情况下对象是通过引用传递的”。
普通的赋值操作只是传递了索引,只有在清除传值对象的时候,才会发生写时复制
```
//示例
$obj = new StdClass;
$obj->name = 'Pig';
dump($obj);
$copy = $obj; // $obj ,$copy都是new StdClass返回的同一个标识符的拷贝
dump($copy); //{ ["name"]=>string(3) "Pig" }
$objRef = &$obj; // 此时会将$obj转换成引用,然后赋值给$objRef,因此$obj,$objRef都为引用
dump($objRef); // { ["name"]=>string(3) "Pig" }
$objClone = clone $obj; //新空间
$obj->name = 'After Clone';
dump($objClone); //{ ["name"]=> "Pig" }
dump($obj); //{ ["name"]=>"After Clone" }
//unset是删除引用效果
$nameRef = &$obj->name; //$obj->name被转换成引用(& string),然后赋给$nameRef
dump($obj); //{ ["name"]=>&string(11) "After Clone" }
unset($nameRef); //删除引用
dump($obj); // { ["name"]=>string(11) "After Clone" }
//null是赋值效果
$nameRef = &$obj->name;//恢复name的引用
dump($obj); // { ["name"]=>&string(11) "After Clone" }
$nameRef = null;
dump($obj); //{ ["name"]=>&NULL }
unset($objRef); //仅删除引用
dump($obj);//{ ["name"]=>&NULL }
$objRef = &$obj; //恢复对象引用
$obj->name = 'Lucy';
$obj = null; //赋值$obj为null,$obj只是new StdClass的标识拷贝,不会影响其内容。
//$objRef做为$obj的引用,会同时被赋值null
//等价 $objRef = null;
dump($obj,$copy,$objRef,$objClone);
// NULL,
// { ["name"]=>&string(4) "Lucy" },
// NULL,
// { ["name"]=>string(3) "Pig" }
```
情景:在一个项目里面使用两个或多个一样的对象,如果使用 new 关键字重新创建对象,再赋值上相同的属性
优处理:PHP 提供了对象克隆功能,可以根据一个对象完全克隆出一个一模一样的对象,而且克隆以后,两个对象互不干扰。
```
//示例
class Person {
private $name;
private $age;
function __construct($name, $age) {
$this->name=$name;
$this->age=$age;
}
function say() {
echo "我的名字叫:".$this->name."<br />";
echo "我的年龄是:".$this->age;
}
}
$p1 = new Person("张三", 20);
$p2 = clone $p1;
$p2->say() //我的名字叫:张三
//我的年龄是:20
```
拓展 ```__clone()```
__clone() 方法只会在对象被克隆的时候自动调用。用意在克隆后改变原对象的内容
深圳 · 龙岗 · 大运软件小镇22栋201
电话:400 182 8580
邮箱:szhulian@qq.com