PHP編程中的__clone()方法使用詳解
可以在對(duì)象類(lèi)中定義一個(gè)__clone()方法來(lái)調(diào)整對(duì)象的克隆行為。此方法的代碼將在克隆操作期間執(zhí)行。除了將所有現(xiàn)有對(duì)象成員復(fù)制到目標(biāo)對(duì)象之外,還會(huì)執(zhí)行__clone()方法指定的操作。下面修改Corporate_Drone類(lèi),增加以下方法:
function __clone() { $this->tiecolor = "blue"; }
之后,創(chuàng)建一個(gè)新的Corporate_Drone對(duì)象,增加employeeid成員的值,克隆這個(gè)對(duì)象,然后輸出一些數(shù)據(jù),從而顯示克隆對(duì)象的tiecolor確實(shí)是通過(guò)__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:
再來(lái)一個(gè)小例子:
<?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 "被吃掉了(對(duì)象被回收) <br />"; } } $apple = new Fruit(); $apple->setName("大蘋(píng)果"); $apple->setColor("紅色"); echo $apple->showColor(); $clone_apple = $apple; $clone_apple->setName("小蘋(píng)果"); $clone_apple->setColor("青色"); echo $clone_apple->showColor(); ?>
上面只是將一個(gè)類(lèi)賦值給另一個(gè)類(lèi),所以此時(shí)內(nèi)存中仍是一個(gè)對(duì)象。
<?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 "被吃掉了(對(duì)象被回收) <br />"; } function __clone(){ $this->name = "克隆水果"; } } $apple = new Fruit(); $apple->setName("大蘋(píng)果"); $apple->setColor("紅色"); echo $apple->showColor(); $clone_apple = clone $apple; $clone_apple->setColor("青色"); echo $clone_apple->showColor(); ?>
clone方法克隆出了一個(gè)新的類(lèi),所以此時(shí)內(nèi)存中有兩個(gè)對(duì)象。
php的__clone()方法對(duì)一個(gè)對(duì)象實(shí)例進(jìn)行的淺復(fù)制,對(duì)象內(nèi)的基本數(shù)值類(lèi)型進(jìn)行的是傳值復(fù)制,而對(duì)象內(nèi)的對(duì)象型成員變量,如果不重寫(xiě)__clone方法,顯式的clone這個(gè)對(duì)象成員變量的話,這個(gè)成員變量就是傳引用復(fù)制,而不是生成一個(gè)新的對(duì)象.如下面一個(gè)例子的第28行注釋所說(shuō)
<?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是會(huì)只被復(fù)制引用,其中一個(gè)account的balance被修改另一個(gè)也同樣會(huì)被修改 } } $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對(duì)象的淺復(fù)制與深復(fù)制的實(shí)例詳解
- PHP中的淺復(fù)制與深復(fù)制的實(shí)例詳解
- PHP對(duì)象克隆clone用法示例
- PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之對(duì)象克隆clone和魔術(shù)方法__clone()用法分析
- PHP動(dòng)態(tài)地創(chuàng)建屬性和方法, 對(duì)象的復(fù)制, 對(duì)象的比較,加載指定的文件,自動(dòng)加載類(lèi)文件,命名空間
- PHP 5.0對(duì)象模型深度探索之對(duì)象復(fù)制
- PHP面向?qū)ο蟪绦蛟O(shè)計(jì)高級(jí)特性詳解(接口,繼承,抽象類(lèi),析構(gòu),克隆等)
- php實(shí)現(xiàn)對(duì)象克隆的方法
- php面向?qū)ο笕ヂ?(十一)__toString()用法 克隆對(duì)象 __call處理調(diào)用錯(cuò)誤
- php5對(duì)象復(fù)制、clone、淺復(fù)制與深復(fù)制實(shí)例詳解
相關(guān)文章
PHP 字符截取 解決中文的截取問(wèn)題,不用mb系列
//字符截取,解決中文的截取問(wèn)題2009-09-09PHP設(shè)計(jì)模式概論【概念、分類(lèi)、原則等】
這篇文章主要介紹了PHP設(shè)計(jì)模式概論,總結(jié)敘述了設(shè)計(jì)模式的基本概念、功能、分類(lèi)、原則等,需要的朋友可以參考下2020-05-05php支持?jǐn)帱c(diǎn)續(xù)傳、分塊下載的類(lèi)
這篇文章主要介紹了php支持?jǐn)帱c(diǎn)續(xù)傳、分塊下載的類(lèi)的相關(guān)資料,需要的朋友可以參考下2016-05-05thinkphp實(shí)現(xiàn)163、QQ郵箱收發(fā)郵件的方法
這篇文章主要介紹了thinkphp實(shí)現(xiàn)163等郵箱收發(fā)郵件的方法,在163網(wǎng)易郵箱上已測(cè)試,特分享給大家2015-12-12隱藏Nginx或Apache以及PHP的版本號(hào)的方法
這篇文章主要介紹了隱藏Nginx或Apache以及PHP的版本號(hào)的方法,主要用來(lái)防止針對(duì)性的漏洞攻擊,需要的朋友可以參考下2016-01-01php導(dǎo)出中文內(nèi)容excel文件類(lèi)實(shí)例
這篇文章主要介紹了php導(dǎo)出中文內(nèi)容excel文件類(lèi),實(shí)例分析了php操作帶有中文內(nèi)容的Excel文件及文件導(dǎo)出的實(shí)現(xiàn)方法,需要的朋友可以參考下2015-07-07php遞歸函數(shù)中使用return的注意事項(xiàng)
php遞歸函數(shù)中使用return的時(shí)候會(huì)碰到無(wú)法正確返回想要的值得情況,下面就來(lái)舉例子來(lái)說(shuō)明一下吧2014-01-01PHP實(shí)現(xiàn)的ID混淆算法類(lèi)與用法示例
這篇文章主要介紹了PHP實(shí)現(xiàn)的ID混淆算法類(lèi)與用法,結(jié)合實(shí)例形式分析了php針對(duì)數(shù)字基于位運(yùn)算、位移等操作的加密解密相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-08-08