<?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,然后再操作属性。
深拷贝:赋值时开辟新内存,对其中一个作出改变,不会影响另一个
浅拷贝:赋值时共用一个内存,也就是引用传递。
相当于取了一个别名,对其中一个修改,会影响另一个*/