PHP基礎(chǔ)之類和對象17——對象復(fù)制
在多數(shù)情況下,我們并不需要完全復(fù)制一個(gè)對象來獲得其中屬性。但有一個(gè)情況下確實(shí)需要:如果你有一個(gè) GTK 窗口對象,該對象持有窗口相關(guān)的資源。你可能會想復(fù)制一個(gè)新的窗口,保持所有屬性與原來的窗口相同,但必須是一個(gè)新的對象(因?yàn)槿绻皇切碌膶ο螅敲匆粋€(gè)窗口中的改變就會影響到另一個(gè)窗口)。還有一種情況:如果對象 A 中保存著對象 B 的引用,當(dāng)你復(fù)制對象 A 時(shí),你想其中使用的對象不再是對象 B 而是 B 的一個(gè)副本,那么你必須得到對象 A 的一個(gè)副本。 對象復(fù)制可以通過 clone 關(guān)鍵字來完成(如果可能,這將調(diào)用對象的?__clone()?方法)。對象中的?__clone()?方法不能被直接調(diào)用。
$copy_of_object = clone $object;
當(dāng)對象被復(fù)制后,PHP 5 會對對象的所有屬性執(zhí)行一個(gè)淺復(fù)制(shallow copy)。所有的引用屬性 仍然會是一個(gè)指向原來的變量的引用。
void?__clone?(?void?)當(dāng)復(fù)制完成時(shí),如果定義了?__clone()?方法,則新創(chuàng)建的對象(復(fù)制生成的對象)中的?__clone()?方法會被調(diào)用,可用于修改屬性的值(如果有必要的話)。
Example #1 復(fù)制一個(gè)對象
<?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è)對象 $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);?>以上例程會輸出:
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. nestjs實(shí)現(xiàn)圖形校驗(yàn)和單點(diǎn)登錄的示例代碼2. html小技巧之td,div標(biāo)簽里內(nèi)容不換行3. 以PHP代碼為實(shí)例詳解RabbitMQ消息隊(duì)列中間件的6種模式4. laravel ajax curd 搜索登錄判斷功能的實(shí)現(xiàn)5. Python 如何將integer轉(zhuǎn)化為羅馬數(shù)(3999以內(nèi))6. python實(shí)現(xiàn)自動(dòng)化辦公郵件合并功能7. 將properties文件的配置設(shè)置為整個(gè)Web應(yīng)用的全局變量實(shí)現(xiàn)方法8. python開發(fā)飛機(jī)大戰(zhàn)游戲9. Echarts通過dataset數(shù)據(jù)集實(shí)現(xiàn)創(chuàng)建單軸散點(diǎn)圖10. css進(jìn)階學(xué)習(xí) 選擇符
