摘要:先看對象復制的代碼在及以后的版本,指向同一個對象。在中,對象的賦值和傳遞都是通過引用進行的。當我們需要一個對象的副本時,可以這么做通過關鍵字,使用值復制方式新生成一個對象。但是這有一個問題,對象中的某些數據,比如,我不想是一樣的。
先看對象復制的代碼
class CopyMe{} $first = new CopyMe(); $second = $first;
在PHP5及以后的版本,$first & $second指向同一個對象。
在PHP中,對象的賦值和傳遞都是通過引用進行的。
當我們需要一個對象的副本時,可以這么做:
class CopyMe{} $first = new CopyMe(); $second = clone $first;
通過clone關鍵字,使用值復制方式新生成一個對象。
但是這有一個問題,對象中的某些數據,比如id,我不想是一樣的。但是clone是做不到的。
這時我們可以通過實現一個特殊的方法__clone()來達到這個目的。當一個對象調用clone關鍵字時,其__clone()方法就會被自動調用。
class Person { public private $id; public function __construct() {} public function setId($id) { $this->id = $id; } public function __clone() { $this->id = 0; } } $person = new Person(); $person->setId(343); $person2 = clone $person;
這樣的賦值屬于淺復制(shallow copy),可以保證所有基本數據類型的屬性被完全復制。
如果我們不希望對象的屬性的屬性被共享,例如:
class Account { public $balance; public function __construct($balance) { $this->balance = $balance; } } class Person { private $name; private $age; private $id; 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() { $this->id = 0; } } $person = new Person("bob", 43, new Account(200)); $person->setId(433); $person2 = clone $person; $person->account->balance += 10; print $person2->account->balance;
得到的結果: 210
實際上我并不想讓$person2的賬戶價格受到另一個對象的影響。
可以顯式的在__clone方法中復制指向的對象。
function __clone() { $this->id = 0; $this->account = clone $this->account; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21653.html
摘要:前言面試中對于技術職位,一般分筆試與面談,如果面試官的一些小問題你可以立馬找到對應的知識點擴展開來,那么這就是你的優(yōu)勢,本系列將講述一些面試中的事,不會很詳細,但是應該比較全面吧。 前言 面試中對于技術職位,一般分筆試與面談,如果面試官的一些小問題你可以立馬找到對應的知識點擴展開來,那么這就是你的優(yōu)勢,本系列將講述一些java面試中的事,不會很詳細,但是應該比較全面吧。 主要內容 說到...
摘要:發(fā)布時最大的變動是對象處理方式。這很容易被誤解為引用,但是存儲器的引用與引用是完全不同的概念。使用引用是一件不好的事情,除了引用本身不好,并且還會使性能下降這個事實外,使用引用這種方式會使得代碼難以維護。 showImg(https://segmentfault.com/img/remote/1460000014082570); 去年我參加了很多次會議,其中八次會議里我進行了相關發(fā)言,...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
閱讀 3694·2021-11-11 10:58
閱讀 2476·2021-09-22 15:43
閱讀 2869·2019-08-30 15:44
閱讀 2188·2019-08-30 13:08
閱讀 1821·2019-08-29 17:28
閱讀 884·2019-08-29 10:54
閱讀 675·2019-08-26 11:46
閱讀 3507·2019-08-26 11:43