PHP基礎(chǔ)之類和對(duì)象17——對(duì)象復(fù)制
在多數(shù)情況下,我們并不需要完全復(fù)制一個(gè)對(duì)象來(lái)獲得其中屬性。但有一個(gè)情況下確實(shí)需要:如果你有一個(gè) GTK 窗口對(duì)象,該對(duì)象持有窗口相關(guān)的資源。你可能會(huì)想復(fù)制一個(gè)新的窗口,保持所有屬性與原來(lái)的窗口相同,但必須是一個(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ù)制可以通過(guò) clone 關(guān)鍵字來(lái)完成(如果可能,這將調(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è)指向原來(lái)的變量的引用。
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. idea設(shè)置提示不區(qū)分大小寫的方法2. Java利用TCP協(xié)議實(shí)現(xiàn)客戶端與服務(wù)器通信(附通信源碼)3. 使用AJAX(包含正則表達(dá)式)驗(yàn)證用戶登錄的步驟4. 利用ajax+php實(shí)現(xiàn)商品價(jià)格計(jì)算5. IDEA 2020.1.2 安裝教程附破解教程詳解6. JS圖片懶加載庫(kù)VueLazyLoad詳解7. Java PreparedStatement用法詳解8. django queryset相加和篩選教程9. Spring如何集成ibatis項(xiàng)目并實(shí)現(xiàn)dao層基類封裝10. IntelliJ IDEA導(dǎo)出項(xiàng)目的方法

網(wǎng)公網(wǎng)安備