PHP对象复制与__clone()方法

在PHP4中,如果需要复制一个对象,只需要直接赋值就可以了,如:

class CTest  
{  
    public num = 0;  
}obj1 = new CTest();  
obj->num = 1;obj2 = obj1;obj2->num = 99;  
echo 'obj1->num = ',obj1->num,'<br>';  
echo 'obj2->num = ',obj2->num;  
在PHP4中,显示结果如下:  
obj1->num = 1obj2->num = 99

这是因为,PHP4中对象复制的默认操作是“深复制”,也就是对象的完全复制,这和普通数据类型(如整数、浮点数等)的操作是一致的;但是,这样会有一个问题,在大型对象传递时,如果只需要传递对象的信息,这样的对象复制规则会产生额外的性能支出(总是完全复制对象的全部信息)。

在PHP5中,对于对象复制默认操作改为“浅复制”,也就是只复制对象的引用,这样可以提高对象信息的传递效率,即不再复制对象的内容,而是传递引用,这样,两个对象变量实际上是指向同一个对象体。对于上面的代码,在PHP5中显示结果如下:

$obj1->num = 99  
$obj2->num = 99

不过,有时候还是需要完全复制一个对象,在PHP5中,我们需要使用clone语句来实现对象的深复制。如下面的代码。

$obj2 = clone $obj1;

此外,如果在使用clone语句复制对象时有什么代码需要额外执行,可以在类中定义一个名为__clone()的方法,它将在执行clone语句时自动被调用。如下面的代码。

class CTest  
{  
    public num = 0;     //     function __clone()     {this->num++;  
    }  
}  

obj1 = new CTest();obj1->num = 99;  
obj2 = cloneobj1;  
echo obj1->num,'<br>',obj2->num;

此代码会显示99和100,因为在对象复制时,对象中的num被自动加1了。需要注意的是,在__clone()方法中,this表示的是新对象,也就是复制的目标对象。

此外,如果需要禁止对象的复制操作,可以将__clone()方法定义为私有(private)成员。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程