首頁  >  文章  >  後端開發  >  關於php中物件引用和析構函數的關係

關於php中物件引用和析構函數的關係

黄舟
黄舟原創
2017-07-02 10:27:361240瀏覽

  在php中建構子析構函式都屬於魔術方法,例如建構子在某一個類別中,當這個類被實例化的時候就會自動調用,而析構函數是在這個類別的物件被銷毀的時候自動調用,預設情況下是在程式執行結束時自動調用。

  如果我們對物件進行了引用,那麼析構函數呼叫也會改變,如果只實例化了一個對象,例如是$obj那麼只要有$obj = null;這個語句時,就表示物件$obj被銷毀,這個時候析構函數會被事先調用,但這個類別的其他物件不受影響。

  如果我們使用$obj1 = &$obj;即使用&符號引用賦值的操作,這個操作不會產生物件的一個新的引用,這所謂的兩個物件其實使用同一記憶體堆空間,當$obj或$obj1其中一個被銷毀時,另一個同時也會消失。

  如果使用$obj1 = $obj;操作時,這是直接賦值操作,會產生一個物件的一個新的引用,當$obj或$obj1其中一個被銷毀時,析構函數不會被執行,另外一個物件還可以正常使用,兩個都銷毀時,析構函數才會執行,這說明兩者還是統一的關係,不是兩個對象,而是一個引用關係,這個引用操作並不是創建一個互不干擾的新對象,而是引用一個對象,當其中一個對象的成員改變時,另外一個對象的成員隨之改變並且相互關聯,所以直接用=賦值是介於= &操作與clone操作之間的一種情況。

  如果進行clone操作,就是$obj1 = clone $obj;這種操作,$obj1和$obj是兩個對象,之間不受任何干擾,改變一個成員不影響另一個成員,在clone是$obj1所有的成員屬性值都完全和$obj一樣,這才是真正意義上的複製。複製時還可以在類別裡面寫上clone()魔術方法,給$obj1某些屬性一個新值或屏蔽不想要的值,實作方法簡單的舉例。

class Player{
    public $name;
    function destruct(){
        echo "Destroying ".$this->name."<br />";
    }
    //设置魔术方法,赋值时会自动调用这里的属性值,作用是初始化值,或屏蔽不想要的值
    function clone(){
        $this->name="gbcs";
    }
}
$james=new Player();
$james2=clone $james;
echo $james2->name.&#39;<br />&#39;;
$james->name="james";
$james2->name="james2";
echo $james->name.&#39;<br />&#39;;
$james=null;
echo $james2->name.&#39;<br />&#39;;

執行結果如下:

根據執行結果可以清楚地看到,clone產生兩個彼此獨立的對象,並且也調用了魔術方法clone(),從析構函數執行順序也可以看出,兩個對像是分開銷毀的,和賦值的意義是不同的。

以上是關於php中物件引用和析構函數的關係的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn