PHP的stdClass


概述

以下是百度百科對php中的 stdClass的描述:

stdClass在PHP5才開始被流行。而stdClass也是zend的一個保留類。stdClass類是PHP的一個內部保留類,初始時沒有成員變量也沒成員方法,所有的魔術方法都被設置為NULL.凡是用new stdClass()的變量,都不可能會出現$a->test()這種方式的使用。PHP5的對象的獨特性,對象在任何地方被調用,都是引用地址型的,所以相對消耗的資源會少一點。在其它頁面為它賦值時是直接修改,而不是引用一個拷貝。

在百度上搜索,有很多人寫的文章中,提到了stdClass是所有類的基類,但是我試了一下:

class Test{}
$t = new Test();
var_dump($t instanceof stdClass);

輸出結果:bool(false)

顯然,stdClass並不是Test的基類,也就是說stdClass不是所有類的基類。

那么stdClass到底是個什么呢?到底是干什么用的呢?

解惑

既然這個類沒有成員變量也沒有審核魔術方法,那么stdClass到底是個什么玩意?

$a = new stdClass();
$a->username = 'a';
$a->email = 'qq';
var_dump($a);

結果輸出:

class stdClass#1 (2) {
public $username =>
string(1) "a"
public $email =>
string(2) "qq"
}

顯然,這完全就是個數據啊。

那么它和數組的區別是什么?我看到晚上一些人是這樣解釋的,以下代碼

$a = new stdClass();
$b = $a;

這樣 a b兩個變量公用一個內存,$b=$a; 是引用賦值,而如果是數組的話,會拷貝整個數組對象。

但是,忘了取址符號了么? $b=&$a , 同樣也是引用賦值啊?有什么區別么? 顯然,以上說法並沒有說服我,stdClass 類的作用是什么呢?它存在的意義在哪里?

等等,引用傳遞?不需要使用取址符號?這不就完全可以在方法的參數和全局變量中使用么?

當然,在方法的參數中傳遞數組,在形參中使用 &$a 也可以達到引用傳遞的效果,但如果函數沒有使用取址符號,傳遞的時候就會復制一份,浪費內存。但是,同時也要承擔對應的風險,復制數組的方法固然浪費了內存,但是無論方法內對數組如何操作,都不會反應到外邊的數組中。如果使用 stdClass 類就不一樣了,你傳進去了,就要做好出來的時候屬性面目全非的准備。

全局變量, 如果在某個靜態方法S中定義一個全局變量,這個變量向所有人提供,這時使用數組就很不地道了。你在方法a中獲取了對象,並設置了對象的屬性,以便於在后邊使用。在之后的方法b中再次獲取此對象,如果你使用的是數組,那么尷尬了,調用方法S返回的數組,對其修改只是對局部變量的數組進行了修改,並沒有達到想要的效果。如果方法S返回的是stdClass對象,那就完全沒有問題了啊。

舉個栗子:

class Test{
    private static $user = [];
    public static function getUser(){
        return self::$user;
    }
}
$a = Test::getUser();
$a['username'] = 'name';
$b = Test::getUser();
var_dump($b);

結果輸出:

array(0) {
}

這時,使用stdClass,效果完全不同:

class Test{
    private static $user = null;
    public static function getUser(){
        if(self::$user === null){
            self::$user = new stdClass();
        }
        return self::$user;
    }
}
$a = Test::getUser();
$a->username = 'name';
$b = Test::getUser();
var_dump(get_object_vars($b));

輸出結果:

array(1) {
'username' =>
string(4) "name"
}

完美~~

stdClass 對於這種向全局提供的屬性再適合不過了,其實也可以使用一個單例類來實現同樣的方法,但是顯然使用stdClass更加靈活,也更加簡潔。

可以使用 get_object_vars($a) 方法講stdClass對象轉成數組,該方法會講對象的屬性轉成數組。


至此,我也想到了stdClass的應用場景。

我相信它還有更多的應用場景,畢竟是直接引用賦值,會對對象直接修改。但是我目前還沒有想到更好的應用場景,唉,才疏學淺。

各位,告辭!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM