在之前的文章中給大家?guī)?lái)了《PHP中的命名空間定義與使用(實(shí)例詳解)》,其中詳細(xì)的介紹了PHP中的命名空間的定義與使用,本篇繼續(xù)給大家看一看PHP中的相關(guān)知識(shí),關(guān)于clone關(guān)鍵字的使用。希望對(duì)大家有幫助!
在我們之前的學(xué)習(xí)中,有很多的關(guān)鍵字,比如$this
、$new
之類的,今天我們繼續(xù)來(lái)看一下在PHP中也算比較常用到的關(guān)鍵字clone
克隆關(guān)鍵字。在學(xué)習(xí)克隆關(guān)鍵字之前,我們需要知道PHP中的對(duì)象模型是通過(guò)引用來(lái)調(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中通過(guò)clone關(guān)鍵字就可以實(shí)現(xiàn)克隆對(duì)象了。
clone
關(guān)鍵字的語(yǔ)法格式如下:
克隆對(duì)象名稱 = clone 原對(duì)象名稱;
你可以把克隆這個(gè)動(dòng)作理解為,把對(duì)象的內(nèi)存區(qū)域進(jìn)行復(fù)制,賦值后的對(duì)象與原對(duì)象之間是相互獨(dú)立的。并且他們之間的成員方法、屬性和值都是完全相同的。
接下來(lái)我們通過(guò)一個(gè)簡(jiǎn)單的實(shí)例來(lái)看一下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ì)象的引用,通過(guò)這個(gè)變量更改屬性的值將會(huì)影響原來(lái)的對(duì)象。所以還是得用clone,更改屬性值不會(huì)影響到原來(lái)的對(duì)象。
通過(guò)上述實(shí)例,我們已經(jīng)知道應(yīng)該如何去克隆一個(gè)對(duì)象來(lái)為我們所用了,但是對(duì)象克隆成功后,他的屬性、成員方法以及值都是和原對(duì)象一模一樣完全相同的,那這時(shí)候我們光說(shuō)更改屬性不會(huì)影響到原來(lái)的對(duì)象,但是應(yīng)該怎樣去給克隆后的副本成員屬性重新賦值呢?這時(shí)候我們就要用到PHP魔術(shù)方法中的__clone()
方法。
__clone()
方法
PHP中__clone()
方法是不能夠直接調(diào)用的,有clone
才有__clone()
,只有通過(guò)clone關(guān)鍵字克隆了一個(gè)對(duì)象的時(shí)候,才能夠通過(guò)這個(gè)克隆出來(lái)的對(duì)象來(lái)調(diào)用__clone()方法。
這時(shí)候再用到clone創(chuàng)建副本的時(shí)候,就需要注意了,PHP會(huì)檢查_(kāi)_clone()是否存在。
要是不存在的話,PHP會(huì)默認(rèn)賦值對(duì)象的全部屬性;如果__clone()存在,也就是定義過(guò)了,那么也就會(huì)負(fù)責(zé)了新對(duì)象的屬性。
加下來(lái)我們通過(guò)一個(gè)實(shí)例來(lái)看一下,實(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(){//通過(guò)__clone()來(lái)更改新對(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è)空的,訪問(wèn)權(quán)限為 private
(私有的)的 __clone()
方法的話,就可以起到禁止克隆的目的了。
大家如果感興趣的話,可以點(diǎn)擊《PHP視頻教程》進(jìn)行