开发者新闻

类复制函数,一种处理类的不同方法。

kaotik  15-Sep-2009 09:54 7347 阅读量   2 评论(s) 
这个以及其他教程也可以在我的网站上找到: 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之后,它会打印出各个对象的详细信息,因为它们都引用了不同的对象和内存位置

上面讨论的克隆技术称为浅复制。还有其他技术称为深复制,其中你创建了对象的副本,这些副本引用其他对象等。
评分 0/5
评分:0/5 (0票)
投票已禁用!


Login

Who's Online

261 user(s) are online (20 user(s) are browsing Publisher)


Members: 0


Guests: 261


more...

Donat-O-Meter

Stats
Goal: $100.00
Due Date: Aug 31
Gross Amount: $0.00
Net Balance: $0.00
Left to go: $100.00
Make donations with PayPal!

Latest GitHub Commits

Categories