这个以及其他教程也可以在我的网站上找到:
http://www.kaotik.biz这篇教程最初由Hitesh Agrawal编写。由于它已经不再在线上,而且是非常好的教程,所以我将其复制到我的网站上。
类复制函数,一种处理类的不同方法。
在PHP 5中,当你将一个对象赋值给另一个对象时,它会创建一个引用副本,而不是创建一个副本。这将会造成很大的混乱,因为所有的对象都将共享为该对象定义的同一内存。为了解决这个问题,PHP 5引入了克隆方法,该方法创建对象的副本。在PHP 5中调用克隆方法时,会自动调用__clone魔术方法。
示例 - 无对象克隆
类 Animal
{
public $name;
public $legs;
function setName($name)
{
$this->name = $name;
}
function setLegs($legs)
{
$this->legs = $legs;
}
}
$tiger = new Animal();
$tiger->name = "Tiger";
$tiger->legs = 4;
$kangaroo = $tiger;
$kangaroo->name = "Kangaroo";
$kangaroo->legs = 2;
echo $tiger->name."---".$tiger->legs;
echo "
".$kangaroo->name."---".$kangaroo->legs;
?>
输出
Kangaroo—2
Kangaroo—2
解释
在此,我创建了一个Animal类的$tiger对象
创建了另一个变量$kangaroo,并将$tiger赋值给$kangaroo
因为两个变量指向相同的内存位置,所以在echo之后打印的详情是最后输入的
示例 – 使用clone函数的上述示例
类 Animal
{
public $name ;
public $legs;
function setName($name)
{
$this->name = $name;
}
function setLegs($legs)
{
$this->legs = $legs;
}
function __clone()
{
echo "
Object Cloning in Progress";
}
}
$tiger = new Animal();
$tiger->name = "Tiger";
$tiger->legs = 4;
$kangaroo = clone $tiger;
$kangaroo->name = "Kangaroo";
$kangaroo->legs = 2;
echo "
".$tiger->name."---".$tiger->legs;
echo "
".$kangaroo->name."---".$kangaroo->legs;
?>
输出
Oject Cloning in Progress
老虎—4
Kangaroo—2
解释
这里我创建了一个$tiger对象,它是Animal类的实例
然后创建了一个新的变量$kangaroo,它是$tiger的克隆。这会调用__clone魔法方法
在echo之后,它会打印出各个对象的详细信息,因为它们都引用了不同的对象和内存位置
上面讨论的克隆技术称为浅复制。还有其他技术称为深复制,其中你创建了对象的副本,这些副本引用其他对象等。