溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用PHP中clone關(guān)鍵字和__clone()方法

發(fā)布時(shí)間:2021-10-25 17:04:29 來源:億速云 閱讀:116 作者:iii 欄目:編程語言

本篇內(nèi)容介紹了“如何使用PHP中clone關(guān)鍵字和__clone()方法”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

如何使用PHP中clone關(guān)鍵字和__clone()方法

在我們之前的學(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é)果:

如何使用PHP中clone關(guān)鍵字和__clone()方法

其中我們需要注意的是,如果使用=將一個(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é)果:

如何使用PHP中clone關(guān)鍵字和__clone()方法

由上述實(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í)用文章!

向AI問一下細(xì)節(jié)

免責(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)容。

php
AI