php之clone 复制对象以及__clone魔术方法
如果錯誤和不足請給予指出,謝謝~
(⊙_⊙)
在開始使用clone之前我們下先看以下一個小例子:
<?php //首先定義一個test一個類 class Testclass {//成員變量是$value1public $value1; } //隨后new一個obj1 $obj1 = new Testclass(); //復制成員變量的值為qqq $obj1->value1 = "qqq"; //我們使用賦值符號給左邊obj2賦值obj1 $obj2 = $obj1; //我們在這里把obj2的的value1復制為eee $obj2->value1 ="eee"; //隨后我們打印出兩者的值 var_dump($obj1); echo '<br/>'; var_dump($obj2);為了查看方便,我把那個解釋寫在了注釋=。=。(這句話總感覺怪怪的)
我們運行一下,發現如下結果:
是不是兩者的值都是一樣的?
那是因為(借用php手冊的話就是):當對象被復制后,PHP 5 會對對象的所有屬性執行一個淺復制(shallow copy)。所有的引用屬性 仍然會是一個指向原來的變量的引用。
其實在這里就是obj1給了obj2它的地址,就和引用一樣,obj2指向了obj1,所以導致兩者所執行的操作將會收到影響。那么該如何解決這樣情況呢?當然是使用clone了;列如下代碼:
<?php //首先定義一個test一個類 class Testclass {//成員變量是$value1public $value1; } //隨后new一個obj1 $obj1 = new Testclass(); //復制成員變量的值為qqq $obj1->value1 = "qqq"; //在這里我們使用clone來賦值obj1 $obj2 =clone $obj1; //我們在這里把obj2的的value1復制為eee $obj2->value1 ="eee"; //隨后我們打印出兩者的值 var_dump($obj1); echo '<br/>'; var_dump($obj2);注意看這一段代碼:
$obj2 =clone $obj1;在這里使用了clone,這樣就會沒事了,看如下運行結果:
是否發現兩者并沒有相互影響呢?
好了,在這里已經完成了基本的clone的講解了,現在我們來深入一下(抽根煙壓壓驚。。。 ( ′′??′?` ) )
我們接下來看看一個例子:
<?php //首先定義一個test一個類 class Testclass {//成員變量是$value1public $value1; } //在這里是定義了一個變量 $vlaue_1='bbj'; //隨后new一個obj1 $obj1 = new Testclass(); //引用value_1的值,注意,是引用 $obj1->value1 = &$vlaue_1; //在這里我們使用clone來賦值obj1 $obj2 =clone $obj1; //我們在這里把obj2的的value1復制為eee $obj2->value1 ="eee"; //隨后我們打印出兩者的值 var_dump($obj1); echo '<br/>'; var_dump($obj2);我們的代碼和之前的差不多,我們主要看這一行:
//引用value_1的值,注意,是引用 $obj1->value1 = &$vlaue_1;注意在此是引用喲。
我們看下運行結果:
是否發現我在obj2改變了value1值之后obj1的值也會改變?因為在這里obj1賦值成員變量的時候使用了&取址。將會成為一個引用的狀態。那么我們如果想要把這個值不守clone出來的對象的值影響該怎么辦呢?
那么在這里我們只需要在此clone一下這個成員變量就好了,該如何clone了?那么我們現在就可以使用我們的魔法方法__clone了。
首先我們來說說__clone()在什么狀態下觸發:
當我們有clone操作的時候將會除非這個類里面的__clone方法。那么把我們的成員變量在__clone方法里面clone一下就好了,如下代碼演示:
注:clone只能用于對象克隆,對象復制。記住,如果你clone一個非對象變量將會報錯no obj。。。
以下例子是我從網上找的一個例子,感覺不錯,這里將用這個例子來講解魔法方法__clone的使用:
本來這個是沒有注釋的,我順便把解釋丟到了里面,這樣強制clone后就不會指向原來的對象了。
以上就是clone的使用方法了=。=。。。
如果錯誤請給予指出,謝謝~
總結
以上是生活随笔為你收集整理的php之clone 复制对象以及__clone魔术方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 之 Final 关键字
- 下一篇: php 序列化对象