PHP基礎(chǔ)之類和對(duì)象17——對(duì)象復(fù)制
在多數(shù)情況下,我們并不需要完全復(fù)制一個(gè)對(duì)象來獲得其中屬性。但有一個(gè)情況下確實(shí)需要:如果你有一個(gè) GTK 窗口對(duì)象,該對(duì)象持有窗口相關(guān)的資源。你可能會(huì)想復(fù)制一個(gè)新的窗口,保持所有屬性與原來的窗口相同,但必須是一個(gè)新的對(duì)象(因?yàn)槿绻皇切碌膶?duì)象,那么一個(gè)窗口中的改變就會(huì)影響到另一個(gè)窗口)。還有一種情況:如果對(duì)象 A 中保存著對(duì)象 B 的引用,當(dāng)你復(fù)制對(duì)象 A 時(shí),你想其中使用的對(duì)象不再是對(duì)象 B 而是 B 的一個(gè)副本,那么你必須得到對(duì)象 A 的一個(gè)副本。 對(duì)象復(fù)制可以通過 clone 關(guān)鍵字來完成(如果可能,這將調(diào)用對(duì)象的?__clone()?方法)。對(duì)象中的?__clone()?方法不能被直接調(diào)用。
$copy_of_object = clone $object;
當(dāng)對(duì)象被復(fù)制后,PHP 5 會(huì)對(duì)對(duì)象的所有屬性執(zhí)行一個(gè)淺復(fù)制(shallow copy)。所有的引用屬性 仍然會(huì)是一個(gè)指向原來的變量的引用。
void?__clone?(?void?)當(dāng)復(fù)制完成時(shí),如果定義了?__clone()?方法,則新創(chuàng)建的對(duì)象(復(fù)制生成的對(duì)象)中的?__clone()?方法會(huì)被調(diào)用,可用于修改屬性的值(如果有必要的話)。
Example #1 復(fù)制一個(gè)對(duì)象
<?php class SubObject {static $instances = 0;public $instance;public function __construct() { $this->instance = ++self::$instances;}public function __clone() { $this->instance = ++self::$instances;} } class MyCloneable {public $object1;public $object2;function __clone(){ // 強(qiáng)制復(fù)制一份this->object, 否則仍然指向同一個(gè)對(duì)象 $this->object1 = clone $this->object1;} } $obj = new MyCloneable(); $obj->object1 = new SubObject(); $obj->object2 = new SubObject(); $obj2 = clone $obj; print('Original Object:n'); print_r($obj); print('Cloned Object:n'); print_r($obj2);?>以上例程會(huì)輸出:
Original Object:MyCloneable Object( [object1] => SubObject Object( [instance] => 1) [object2] => SubObject Object( [instance] => 2))Cloned Object:MyCloneable Object( [object1] => SubObject Object( [instance] => 3) [object2] => SubObject Object( [instance] => 2))
相關(guān)文章:
1. moment轉(zhuǎn)化時(shí)間戳出現(xiàn)Invalid Date的問題及解決2. python爬蟲實(shí)戰(zhàn)之制作屬于自己的一個(gè)IP代理模塊3. WML的簡單例子及編輯、測(cè)試方法第1/2頁4. HTML 絕對(duì)路徑與相對(duì)路徑概念詳細(xì)5. 如何在jsp界面中插入圖片6. ajax請(qǐng)求后臺(tái)得到j(luò)son數(shù)據(jù)后動(dòng)態(tài)生成樹形下拉框的方法7. Ajax返回值類型與用法實(shí)例分析8. .NET6打包部署到Windows Service的全過程9. 開發(fā)效率翻倍的Web API使用技巧10. asp批量添加修改刪除操作示例代碼
