面向对象PHP之Clone对象

###序言 咱们这里讨论的Clone是指的 PHP5 以后的版本。PHP5 以后 若是这样复制对象是将指向对象的引用进行复制。php

$p1=new Person();
$p2=$p1;
复制代码

而使用clone关键字则是对对象的实际内存内容进行复制,至关于从新开辟了一个内存块和一个指向该内存块的引用。bash

$p3=clone $p1;
复制代码

在实际场景中有时候不但愿对内存中的内容彻底的进行复制,这里 PHP 提供了一个内置的函数__clone(),该函数在对象进行克隆时会自动调用,这里须要特别注意的是,__clone()函数做用域里的$this关键字指代的是***克隆后产生的对象***,而不是被克隆的对象,下面用代码来演示一下。函数

###实例学习

class Person{
    private $name='yang';
    private $age=18;
    public function setName($name){
        $this->name=$name;
    }
    function __clone() {
        $this->name='xiaoming';
    }
}
$p1=new Person();
$p2=$p1;
$p3=clone $p1;
echo 'Before $p1 change';
var_dump($p1);
var_dump($p2);
var_dump($p3);
$p1->setName('yang1');
echo 'After $p1 change';
var_dump($p1);
var_dump($p2);
var_dump($p3);
复制代码

查看运行结果:this

clone1

咱们能够看到在对象$p1 改变以后对象$p2也相应的改变了,这是由于$p1,$p2两个变量只是指向对象内存的引用,这里学习过C语言的应该已经清楚了,就跟C语言的指针相似。而当保存对象真正的内存里面的内容改变后,咱们经过$p1,$p2这两个引用去访问的其实同一个内容,固然获得的内容是同样的,同时咱们看到$p3的值在$p1变化后并无发生变化。spa

这里$p3变量若是Person类里面没有__clone()方法,其指向的内存块里面包含的内容实际上是和$p1是同样的(注意不是内存块同样,是两个不一样的内存块里面包含的数据同样),在加了__clone()方法后,咱们发如今克隆$p1$p3内存内的name属性已经变成了xiaoming指针

可能语言表示的不是太清楚,下面用图来表示一下。code

clone2

###小结对象

在PHP中赋值的默认复制方法是引用的复制,当咱们有的时候不想在两个复制的对象之间共用某一属性(或者对象)时,咱们就可使用clone关键字,这样就至关于给复制出来的新对象从新开辟了一个内存块,对新旧两个对象的相关属性(或者对象)操做就不会相互影响了。ip

相关文章
相关标签/搜索