您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“如何使用PHP中clone關(guān)鍵字和__clone()方法”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
在我們之前的學(xué)習(xí)中,有很多的關(guān)鍵字,比如$this
、$new
之類的,今天我們繼續(xù)來看一下在PHP中也算比較常用到的關(guān)鍵字clone
克隆關(guān)鍵字。在學(xué)習(xí)克隆關(guān)鍵字之前,我們需要知道PHP中的對(duì)象模型是通過引用來調(diào)用對(duì)象的,但是又是偶需要建議一個(gè)對(duì)象的副本,目的就是想再原有對(duì)象改變的時(shí)候能夠不影響到對(duì)象副本。
這時(shí)候如果使用new關(guān)鍵字是可以重新創(chuàng)建對(duì)象,然后再給屬性賦上相同的值,也是可以起到新建副本的作用,但是這種方法不僅麻煩而且容易出錯(cuò),這時(shí)候就希望PHP能有一個(gè)完全一樣的對(duì)象,而且這兩個(gè)還不是互相干擾的,也就是我們想的克隆。那應(yīng)該怎樣去實(shí)現(xiàn)呢?不慌,接著看。
clone
關(guān)鍵字
我們希望有一個(gè)能夠和原本對(duì)象互不干擾的副本,在PHP中通過clone關(guān)鍵字就可以實(shí)現(xiàn)克隆對(duì)象了。
clone
關(guān)鍵字的語法格式如下:
克隆對(duì)象名稱 = clone 原對(duì)象名稱;
你可以把克隆這個(gè)動(dòng)作理解為,把對(duì)象的內(nèi)存區(qū)域進(jìn)行復(fù)制,賦值后的對(duì)象與原對(duì)象之間是相互獨(dú)立的。并且他們之間的成員方法、屬性和值都是完全相同的。
接下來我們通過一個(gè)簡單的實(shí)例來看一下clone的能力吧,示例如下:
<?php class father{ public $study1, $study2; public function __construct($study1, $study2){ $this -> study1 = $study1; $this -> study2 = $study2; } public function output(){ echo $this -> study1.','. $this -> study2.'<br>'; } } $obj = new father('好好學(xué)習(xí)', '天天向上'); $obj2 = clone $obj;//克隆$obj $obj -> output(); $obj2 -> output(); echo '<pre>'; var_dump($obj); var_dump($obj2); ?>
輸出結(jié)果:
其中我們需要注意的是,如果使用=將一個(gè)對(duì)象賦值給一個(gè)變量,那么這時(shí)得到的將是一個(gè)對(duì)象的引用,通過這個(gè)變量更改屬性的值將會(huì)影響原來的對(duì)象。所以還是得用clone,更改屬性值不會(huì)影響到原來的對(duì)象。
通過上述實(shí)例,我們已經(jīng)知道應(yīng)該如何去克隆一個(gè)對(duì)象來為我們所用了,但是對(duì)象克隆成功后,他的屬性、成員方法以及值都是和原對(duì)象一模一樣完全相同的,那這時(shí)候我們光說更改屬性不會(huì)影響到原來的對(duì)象,但是應(yīng)該怎樣去給克隆后的副本成員屬性重新賦值呢?這時(shí)候我們就要用到PHP魔術(shù)方法中的__clone()
方法。
__clone()
方法
PHP中__clone()
方法是不能夠直接調(diào)用的,有clone
才有__clone()
,只有通過clone關(guān)鍵字克隆了一個(gè)對(duì)象的時(shí)候,才能夠通過這個(gè)克隆出來的對(duì)象來調(diào)用__clone()方法。
這時(shí)候再用到clone創(chuàng)建副本的時(shí)候,就需要注意了,PHP會(huì)檢查__clone()是否存在。
要是不存在的話,PHP會(huì)默認(rèn)賦值對(duì)象的全部屬性;如果__clone()存在,也就是定義過了,那么也就會(huì)負(fù)責(zé)了新對(duì)象的屬性。
加下來我們通過一個(gè)實(shí)例來看一下,實(shí)例如下:
<?php class father{ public $name, $url; public function __construct($name, $url){ $this -> name = $name; $this -> url = $url; } public function output(){ echo $this -> name.','.$this -> url.'<br>'; } public function __clone(){//通過__clone()來更改新對(duì)象的屬性 $this -> name = '福如東海'; $this -> url = '壽比南山'; } } $obj = new father('好好學(xué)習(xí)', '天天向上'); $obj2 = clone $obj; $obj -> output(); $obj2 -> output(); ?>
輸出結(jié)果:
由上述實(shí)例,可以看出__clone() 方法不需要任何參數(shù)。其中我們還有一點(diǎn)可以知道的就是,想要禁止克隆的話,只需要在類中設(shè)置一個(gè)空的,訪問權(quán)限為 private
(私有的)的 __clone()
方法的話,就可以起到禁止克隆的目的了。
“如何使用PHP中clone關(guān)鍵字和__clone()方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。