请大神指教一下!

来源:2-10 PHP类和对象之对象的高级特性

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

写回答 关注

2回答

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


    昼颜你不懂 回复Scny

    慢慢学,以后就会完全搞懂的

    2016-02-03 19:12:48

    共 2 条回复 >

  • 慕侠4006623
    2021-04-05 11:04:53

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

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

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


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

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

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


PHP进阶篇

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

181734 学习 · 2575 问题

查看课程

相似问题