構造函數與析構函數執行順序,記一次小bug修復。

class Test {
    protected $client;
    protected static $name;

    public function __construct() {
        self::$name = 'test';
    }

    public function __destruct() {
        self::$name = null;
    }

    public function get() {
        return self::$name;
    }
}
$a = new Test();
$a = (new Test());
echo $a->get();

執行完以上代碼時輸出:php

此時你會發現,輸出的是空,而沒有輸出test。修改代碼,查看下整個流程。函數

class Test {
    protected $client;
    protected static $name;

    public function __construct() {
        self::$name = 'test';
        echo "執行構造函數!\n";
    }

    public function __destruct() {
        self::$name = null;
        echo "執行析構函數!\n";
    }

    public function get() {
        return self::$name;
    }
}
$a = new Test();
echo "第一次new完畢!\n";
$a = (new Test());
echo "第二次new完畢!\n";
echo $a->get();

執行輸出:ui

執行構造函數!
第一次new完畢!
執行構造函數!
執行析構函數!
第二次new完畢!
執行析構函數!

終於逮到你了。。。當新建立類賦值於同一個變量時,究竟是先建立,仍是先銷燬呢?是先建立新對象,而後再銷燬舊對象。這就致使了先執行構造函數,而後再執行析構函數。在這一過程當中切記不要操做對象內的靜態屬性,不然會致使靜態屬性丟失。code

第一發布地對象

相關文章
相關標籤/搜索