Scny
2016-01-31 20:42
<?php class Car { public $name = 'car'; public function __clone() { $obj = new Car(); $obj->name = $this->name; } } $a = new Car(); $a->name = 'new car'; $b = clone $a; if ($a == $b) echo '=='; //true if ($a === $b) echo '==='; //false $str = serialize($a); //对象序列化成字符串 echo $str.'<br>'; $c = unserialize($str); //反序列化为对象 var_dump($c);
中间的
$obj = new Car();
$obj->name = $this->name;
这两段有啥用呀,去掉再运行没有什么不同?
$a = new Car(); # $a是对象的引用变量 $b = clone $a; # $b是$a对象的shallow copy(浅拷贝) Php和Java一样,clone函数默认的clone操作都是shallow copy,并没有包含在对象中的内部对象。 由于这个矛盾和我们使用clone函数想要实现新创建的对象和旧对象互不影响(浅拷贝会将旧对象内部的引用变量的值--相当于旧对象的内部对象也拷贝到新对象中,而这个新对象也因此拥有了旧对象的内部对象,这样就有了一块共同的内存,和我们设计clone的初衷不吻合),因此Php通常会重写__clone函数,在里面在重新创建一个Car类的对象,然后再操作属性。 当然这种区别在本例的这些代码中体现不出来,因此就会有你的那个问题。事实上必须加上这几句话,否则后患无穷。
/*备注:clone函数默认的clone操作都是浅拷贝,共用一块内存。
设计初衷是用clone函数实现新创建的对象和旧对象互不影响。
因此,需要在__clone里面重新创建一个Car类的对象$c,然后再操作属性。
深拷贝:赋值时开辟新内存,对其中一个作出改变,不会影响另一个
浅拷贝:赋值时共用一个内存,也就是引用传递。
相当于取了一个别名,对其中一个修改,会影响另一个*/
PHP进阶篇
181835 学习 · 2577 问题
相似问题