PHP的对象复制

来源:互联网 发布:剑网三大师捏脸数据 编辑:程序博客网 时间:2024/05/16 09:40

这里要说的PHP对象复制包括两个部分:一是对象赋值给一个变量,二是使用clone复制对象。

一、对象赋值

先看下面的代码:

class SimpleClass{public $var = 'a default value';public function displayVar() {echo $this->var;}}$instance = new SimpleClass();$reference = &$instance;$assigned = $instance;$instance->var = '$assigned will have this value';$instance = null;var_dump($instance);var_dump($assigned);var_dump($reference);
输出:

nullobject(SimpleClass)[1]  public 'var' => string '$assigned will have this value' (length=30)null
PHP的引用是别名,就是两个不同的变量名指向相同的内容。所以在上面的代码中,当$instance指向的内容设置为null以后,$reference也就变成null了。再看下面的代码:

class SimpleClass{public $var = 'a default value';public function displayVar() {echo $this->var;}}$instance = new SimpleClass();$reference = &$instance;$assigned = $instance;$instance->var = '$assigned will have this value';unset($instance);var_dump($instance);var_dump($assigned);var_dump($reference);
输出:

nullobject(SimpleClass)[1]  public 'var' => string '$assigned will have this value' (length=30)object(SimpleClass)[1]  public 'var' => string '$assigned will have this value' (length=30)
使用unset以后,由于$reference只是$instance的别名,所以即使$instance被释放了(unset只是解除变量名和变量之间的关联),但是它指向的内容没有改变,对$reference没有影响。

另外,在PHP5中,一个对象变量已经不再保存整个对象的值。只是保存一个标识符来访问真正的对象内容。所以上面的$instance和$assigned指向同一个标识符的不同拷贝,而$instnce和$reference指向的是同一个标识符。即其实上面$instance设置为null,是把标识符设为null,对象还是在的。

二、clone复制对象

使用赋值获得的对象,在修改了$instance里的属性值以后,$assigned的属性值也发生了变化。但是有时候,我们需要独立的两个对象,不会相互影响,这时可以通过clone关键字来实现。这部分请参考手册实例。

说明:

1、PHP5对象复制是采用引用的方式;

2、如果不采用引用方式,则需要在复制对象时加关键字 clone;

3、如果在复制的过程中,同时要变更某些属性,则增加函数_clone();

参考文章:

1、php对象copy

2、对象和引用

3、PHP引用以及误区

4、对象复制

5、写时复制

6、PHP新对象

原创粉丝点击