在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)成员。