在之前的文章中給大家?guī)砹恕禤HP中的命名空間定義與使用(實例詳解)》,其中詳細的介紹了PHP中的命名空間的定義與使用,本篇繼續(xù)給大家看一看PHP中的相關知識,關于clone關鍵字的使用。希望對大家有幫助!
在我們之前的學習中,有很多的關鍵字,比如$this
、$new
之類的,今天我們繼續(xù)來看一下在PHP中也算比較常用到的關鍵字clone
克隆關鍵字。在學習克隆關鍵字之前,我們需要知道PHP中的對象模型是通過引用來調用對象的,但是又是偶需要建議一個對象的副本,目的就是想再原有對象改變的時候能夠不影響到對象副本。
這時候如果使用new關鍵字是可以重新創(chuàng)建對象,然后再給屬性賦上相同的值,也是可以起到新建副本的作用,但是這種方法不僅麻煩而且容易出錯,這時候就希望PHP能有一個完全一樣的對象,而且這兩個還不是互相干擾的,也就是我們想的克隆。那應該怎樣去實現(xiàn)呢?不慌,接著看。
clone
關鍵字
我們希望有一個能夠和原本對象互不干擾的副本,在PHP中通過clone關鍵字就可以實現(xiàn)克隆對象了。
clone
關鍵字的語法格式如下:
克隆對象名稱 = clone 原對象名稱;
你可以把克隆這個動作理解為,把對象的內存區(qū)域進行復制,賦值后的對象與原對象之間是相互獨立的。并且他們之間的成員方法、屬性和值都是完全相同的。
接下來我們通過一個簡單的實例來看一下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('好好學習', '天天向上'); $obj2 = clone $obj;//克隆$obj $obj -> output(); $obj2 -> output(); echo '<pre>'; var_dump($obj); var_dump($obj2); ?>
輸出結果:
其中我們需要注意的是,如果使用=將一個對象賦值給一個變量,那么這時得到的將是一個對象的引用,通過這個變量更改屬性的值將會影響原來的對象。所以還是得用clone,更改屬性值不會影響到原來的對象。
通過上述實例,我們已經(jīng)知道應該如何去克隆一個對象來為我們所用了,但是對象克隆成功后,他的屬性、成員方法以及值都是和原對象一模一樣完全相同的,那這時候我們光說更改屬性不會影響到原來的對象,但是應該怎樣去給克隆后的副本成員屬性重新賦值呢?這時候我們就要用到PHP魔術方法中的__clone()
方法。
__clone()
方法
PHP中__clone()
方法是不能夠直接調用的,有clone
才有__clone()
,只有通過clone關鍵字克隆了一個對象的時候,才能夠通過這個克隆出來的對象來調用__clone()方法。
這時候再用到clone創(chuàng)建副本的時候,就需要注意了,PHP會檢查__clone()是否存在。
要是不存在的話,PHP會默認賦值對象的全部屬性;如果__clone()存在,也就是定義過了,那么也就會負責了新對象的屬性。
加下來我們通過一個實例來看一下,實例如下:
<?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()來更改新對象的屬性 $this -> name = '福如東海'; $this -> url = '壽比南山'; } } $obj = new father('好好學習', '天天向上'); $obj2 = clone $obj; $obj -> output(); $obj2 -> output(); ?>
輸出結果:
由上述實例,可以看出__clone() 方法不需要任何參數(shù)。其中我們還有一點可以知道的就是,想要禁止克隆的話,只需要在類中設置一個空的,訪問權限為 private
(私有的)的 __clone()
方法的話,就可以起到禁止克隆的目的了。
大家如果感興趣的話,可以點擊《PHP視頻教程》進行