您好,UncleToo欢迎您!  为了更好的浏览本站,请使用高版本浏览器
RSS  Tag     设为首页 | 加入收藏
 您所在的位置:首页 > PHP技术 > PHP基础

PHP教程:php面向对象Clone与序列化

作者:zooso  来源:转载  日期:2015-06-15 23:08:52
收藏  评论:( 1 )  阅读:431

对象的复制时有三种方案:

1、直接复制   $a = $b

这种是浅拷贝,当改变$a的时候$b也会改变,因为他们指向的是同一块堆区;


2、clone复制  $a = clone $b

这种拷贝貌似是深拷贝,当$a发生变化的时候$b不会跟着变化,同时PHP提供了魔术方法__Clone()可以自定义Clone复

制,哪些属性不想被复制,复制过程中需要哪些改变,都可以在__clone()方法中自定义。

但是这种复制的方法有个缺陷,需要注意,如果类中的某个属性的类型是另外一个类,那么在Clone的时候这个属性会不

会被深拷贝,是不是很尴尬,当然这点缺陷是可以通过魔术方法__clone来进行弥补的,在__clone()方法中为这个属性new一个

新的类就是了。

class test{
    private $name;
    private $sex;
    private $demo;
    public function __construct($name,$sex,$demo){
        $this->name = $name;
        $this->sex  = $sex;
        $this->demo = $demo;
    }
    public function __set($key,$value){
        $this->{$key} = $value;
    }
    public function __get($key){
        return $this->{$key};
    }
    public function __clone(){
        $this->name='null';  //这里可以自定义clone
    }
}


class demo{
    private $name;
    public function __construct($name='demo01'){
        $this->name = $name;
    }
                                                                                                                         
    public function __set($key,$value){
        $this->{$key} = $value;
    }
                                                                                                                         
    public function __get($key){
        return $this->{$key};
    }
}


$t = new test('aa', 'bb',new demo('d01'));
$d = clone $t;
//$d->name='nihao';
$d->demo->name = 'd02';
var_dump($t);   //结果 $t->demo->name   d02


使用clone弥补

public function __clone(){
    $this->name='null';
    $this->demo = new demo('init');
}


3、序列化复制

$b = unserialize(serialize($t));

这样不需要使用clone魔术方法既可以实现属性中引用类型的深拷贝了。

原文地址:http://blog.csdn.net/zhaozonglu/article/details/46494525



除非特别声明,本站所有PHP教程及其他教程/文章均为原创、翻译或网友投稿,版权均归UncleToo中文网所有, 转载请注明作者及出处。
原文网址:http://www.uncletoo.com/html/base/1131.html
读完这篇文章后,你是否有所收获? 分享是一种生活的信念!
  • 0
  • 0
我来说两句
更多>>网友评论