<?php
class MyClass {
public $var= 1;
}
$obj1 = new MyClass();
$obj2 = $obj1;
$obj2 ->var=2;
print $obj1->var;
在PHP4中。这个代码会打印出1,因为$obj2被赋予了$obj1的对象值,因此$obj2是$obj1的一个拷贝,从而改变了$obj2的时候$obj1不会被更改。但是在PHP5中,因为$obj1是一个对象句柄(它的id号),所以复制的到$obj2的是一个句柄。因此。运行这个代码片段后,结果输出的是2.
clone.png下面的例子描述一个你可能要执行__clone()方法的一个典型的情况。假设你有一个对象,他存储着一个资源,例如一个文件句柄。你需要一个新的对象,而且他不能指向同一个文件句柄,而是打开一个新的文件从而拥有它自己的一个拷贝:
<?php
/**
* Created by PhpStorm.
* User: ZhouTengFu
* Date: 2018/2/13
* Time: 上午1:17
*/
class MyFile{
private $file_name;
private $file_handle = NULL;
function setFileName($file_name)
{
$this->file_name=$file_name;
}
function openFileForReading()
{
$this->file_handle = fopen($this->file_name,'r');
}
function __clone()
{
if ($this->file_handle){
//此时文件句柄重新生成
$this->file_handle = fopen($this->file_name,"r");
}
}
}
虽然这个代码只写了一部分,但是你可以看到一个控制克隆过程。在这个代码片段中,$file_name被原样的从对象中复制了,但是原对象有一个打开的文件句柄。因此新的对象拷贝将通过打开该文件创建一个他自己的指向该文件的句柄。
网友评论