为了账号安全,请及时绑定邮箱和手机立即绑定

请大神指教一下!

<?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;
    这两段有啥用呀,去掉再运行没有什么不同?

正在回答

2 回答

$a = new Car();  # $a是对象的引用变量
$b = clone $a;   # $b是$a对象的shallow copy(浅拷贝)
  Php和Java一样,clone函数默认的clone操作都是shallow copy,并没有包含在对象中的内部对象。
由于这个矛盾和我们使用clone函数想要实现新创建的对象和旧对象互不影响(浅拷贝会将旧对象内部的引用变量的值--相当于旧对象的内部对象也拷贝到新对象中,而这个新对象也因此拥有了旧对象的内部对象,这样就有了一块共同的内存,和我们设计clone的初衷不吻合),因此Php通常会重写__clone函数,在里面在重新创建一个Car类的对象,然后再操作属性。
  当然这种区别在本例的这些代码中体现不出来,因此就会有你的那个问题。事实上必须加上这几句话,否则后患无穷。


1 回复 有任何疑惑可以回复我~
#1

Scny 提问者

虽然有点不懂。还是谢谢了
2016-02-01 回复 有任何疑惑可以回复我~
#2

昼颜你不懂 回复 Scny 提问者

慢慢学,以后就会完全搞懂的
2016-02-03 回复 有任何疑惑可以回复我~

/*备注:clone函数默认的clone操作都是浅拷贝,共用一块内存。

设计初衷是用clone函数实现新创建的对象和旧对象互不影响。

因此,需要在__clone里面重新创建一个Car类的对象$c,然后再操作属性。


深拷贝:赋值时开辟新内存,对其中一个作出改变,不会影响另一个

浅拷贝:赋值时共用一个内存,也就是引用传递。

相当于取了一个别名,对其中一个修改,会影响另一个*/


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
PHP进阶篇
  • 参与学习       181710    人
  • 解答问题       2575    个

轻松学习PHP中级课程,进行全面了解,用PHP快速开发网站程序

进入课程

请大神指教一下!

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信