PHP編程中的__clone()方法使用詳解
可以在對象類中定義一個__clone()方法來調(diào)整對象的克隆行為。此方法的代碼將在克隆操作期間執(zhí)行。除了將所有現(xiàn)有對象成員復(fù)制到目標(biāo)對象之外,還會執(zhí)行__clone()方法指定的操作。下面修改Corporate_Drone類,增加以下方法:
function __clone() {
$this->tiecolor = "blue";
}
之后,創(chuàng)建一個新的Corporate_Drone對象,增加employeeid成員的值,克隆這個對象,然后輸出一些數(shù)據(jù),從而顯示克隆對象的tiecolor確實(shí)是通過__clone()方法設(shè)置的。示例代碼:
<?php
// Create new corporatedrone object
$drone1 = new corporatedrone();
// Set the $drone1 employeeid member
$drone1->setEmployeeID("12345");
// Clone the $drone1 object
$drone2 = clone $drone1;
// Set the $drone2 employeeid member
$drone2->setEmployeeID("67890");
// Output the $drone1 and $drone2 employeeid members
echo "drone1 employeeID: ".$drone1->getEmployeeID()."<br />";
echo "drone2 employeeID: ".$drone2->getEmployeeID()."<br />";
echo "drone2 tiecolor: ".$drone2->getTiecolor()."<br />";
?>
程序運(yùn)行結(jié)果
drone1 employeeID: 12345 drone2 employeeID: 67890 drone2 tiecolor:
再來一個小例子:
<?php
class Fruit {
private $name = "水果";
private $color = "顏色";
public function setName($name){
$this->name = $name;
}
public function setColor($color){
$this->color = $color;
}
function showColor(){
return $this->color.'的'.$this->name."<br />";
}
function __destruct(){
echo "被吃掉了(對象被回收) <br />";
}
}
$apple = new Fruit();
$apple->setName("大蘋果");
$apple->setColor("紅色");
echo $apple->showColor();
$clone_apple = $apple;
$clone_apple->setName("小蘋果");
$clone_apple->setColor("青色");
echo $clone_apple->showColor();
?>
上面只是將一個類賦值給另一個類,所以此時內(nèi)存中仍是一個對象。
<?php
class Fruit {
private $name = "水果";
private $color = "顏色";
public function setName($name){
$this->name = $name;
}
public function setColor($color){
$this->color = $color;
}
function showColor(){
return $this->color.'的'.$this->name."<br />";
}
function __destruct(){
echo "被吃掉了(對象被回收) <br />";
}
function __clone(){
$this->name = "克隆水果";
}
}
$apple = new Fruit();
$apple->setName("大蘋果");
$apple->setColor("紅色");
echo $apple->showColor();
$clone_apple = clone $apple;
$clone_apple->setColor("青色");
echo $clone_apple->showColor();
?>
clone方法克隆出了一個新的類,所以此時內(nèi)存中有兩個對象。
php的__clone()方法對一個對象實(shí)例進(jìn)行的淺復(fù)制,對象內(nèi)的基本數(shù)值類型進(jìn)行的是傳值復(fù)制,而對象內(nèi)的對象型成員變量,如果不重寫__clone方法,顯式的clone這個對象成員變量的話,這個成員變量就是傳引用復(fù)制,而不是生成一個新的對象.如下面一個例子的第28行注釋所說
<?php
class Account {
public $balance;
public function __construct($balance) {
$this->balance = $balance;
}
}
class Person {
private $id;
private $name;
private $age;
public $account;
public function __construct($name, $age, Account $account) {
$this->name = $name;
$this->age = $age;
$this->account = $account;
}
public function setId($id) {
$this->id = $id;
}
public function __clone() { #復(fù)制方法,可在里面定義再clone是進(jìn)行的操作
$this->id = 0;
$this->account = clone $this->account; #不加這一句,account在clone是會只被復(fù)制引用,其中一個account的balance被修改另一個也同樣會被修改
}
}
$person = new Person("peter", 15, new Account(1000));
$person->setId(1);
$person2 = clone $person;
$person2->account->balance = 250;
var_dump($person, $person2);
?>
輸出:
object(Person)#1 (4) { ["id":"Person":private]=> int(1) ["name":"Person":private]=> string(5) "peter" ["age":"Person":private]=> int(15) ["account"]=> object(Account)#2 (1) { ["balance"]=> int(1000) } } object(Person)#3 (4) { ["id":"Person":private]=> int(0) ["name":"Person":private]=> string(5) "peter" ["age":"Person":private]=> int(15) ["account"]=> object(Account)#4 (1) { ["balance"]=> int(250) } }
- PHP對象的淺復(fù)制與深復(fù)制的實(shí)例詳解
- PHP中的淺復(fù)制與深復(fù)制的實(shí)例詳解
- PHP對象克隆clone用法示例
- PHP面向?qū)ο蟪绦蛟O(shè)計之對象克隆clone和魔術(shù)方法__clone()用法分析
- PHP動態(tài)地創(chuàng)建屬性和方法, 對象的復(fù)制, 對象的比較,加載指定的文件,自動加載類文件,命名空間
- PHP 5.0對象模型深度探索之對象復(fù)制
- PHP面向?qū)ο蟪绦蛟O(shè)計高級特性詳解(接口,繼承,抽象類,析構(gòu),克隆等)
- php實(shí)現(xiàn)對象克隆的方法
- php面向?qū)ο笕ヂ?(十一)__toString()用法 克隆對象 __call處理調(diào)用錯誤
- php5對象復(fù)制、clone、淺復(fù)制與深復(fù)制實(shí)例詳解
相關(guān)文章
PHP批量上傳圖片的具體實(shí)現(xiàn)方法介紹.
這篇文章主要介紹了PHP批量上傳圖片的具體實(shí)現(xiàn)方法。需要的朋友可以過來參考下,希望對大家有所幫助2014-02-02
PHP采用XML-RPC構(gòu)造Web Service實(shí)例教程
這篇文章主要介紹了PHP采用XML-RPC構(gòu)造Web Service,需要的朋友可以參考下2014-07-07
php在多維數(shù)組中根據(jù)鍵名快速查詢其父鍵以及父鍵值的代碼
有一個多維數(shù)組,有多少維大家可以自定義。假如我們要在這個數(shù)組中找一個鍵為'subIndex'的值,我們可以用for、foreach等方法遍歷查找 反過來,假如我們?nèi)我饨o出一個或多個鍵,要求找出這個鍵的父級數(shù)組的鍵和值。這又如何實(shí)現(xiàn)?2011-05-05
PHP圖像處理 imagestring添加圖片水印與文字水印操作示例
這篇文章主要介紹了PHP圖像處理 imagestring添加圖片水印與文字水印操作,結(jié)合實(shí)例形式分析了PHP使用imagestring添加圖片水印與文字水印具體操作步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2020-02-02
php實(shí)現(xiàn)xml數(shù)據(jù)轉(zhuǎn)數(shù)組兩種方式
這篇文章主要為大家詳細(xì)介紹了php實(shí)現(xiàn)xml數(shù)據(jù)轉(zhuǎn)數(shù)組兩種方式的相關(guān)知識,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的小伙伴可以參考下2023-11-11
php+ajax實(shí)現(xiàn)無刷新數(shù)據(jù)分頁的辦法
這篇文章主要介紹了php+ajax實(shí)現(xiàn)無刷新分頁的方法,詳細(xì)講述了數(shù)據(jù)庫的創(chuàng)建、Ajax文件的實(shí)現(xiàn)及PHP調(diào)用方法,需要的朋友可以參考下2015-11-11
thinkphp3.2點(diǎn)擊刷新生成驗(yàn)證碼
這篇文章主要介紹了thinkphp3.2點(diǎn)擊刷新生成驗(yàn)證碼的相關(guān)資料,需要的朋友可以參考下2016-02-02
PHP基于cookie實(shí)現(xiàn)統(tǒng)計在線人數(shù)功能示例
這篇文章主要介紹了PHP基于cookie實(shí)現(xiàn)統(tǒng)計在線人數(shù)功能,涉及php文件讀寫、cookie訪問、計算等相關(guān)操作技巧,需要的朋友可以參考下2019-01-01

