PHP動態屬性和stdclass

Bacer發表於2021-09-09

動態屬性不是PHP專有的,很多解釋型語言都有這個功能,比如javascript。它可以動態的為其物件新增刪除屬性。PHP也可以動態的新增屬性,如下面的例子:


class testClass{public $A='a';}$t=new testClass();echo $t->A,'
'
;echo 'B isset=',isset($t->B)?'Y':'N','
'
;//$t中並沒有變數B$t->B='b';//$t中給新增了變數B,並且賦值。echo 'B isset=',isset($t->B)?'Y':'N','
'
;echo '$t->B=',$t->B,'
'
;unset($t->B);//$t中給刪除變數B。echo 'B isset=',isset($t->B)?'Y':'N','
'
;

這讓人想起PHP中的魔術方法,__get和__set,這兩個魔術方法也可以完成這種類似的功能,但是使用他們就顯得複雜。因此只有當一些比較複雜的情況下才會使用 這魔術方法。

有了這種動態屬性新增的能力,你可以定義一個空的類,然後隨時隨地,在要用到屬性的時候自動新增,很方便。

這種動態屬性新增的能力,在型別轉換的時候顯得很有用。在型別轉換的時候,不得不提到stdClass,它是PHP中一個保留的類。官方文件對於這個stdClass描述甚少。下面官方文件的描述:

Converting to object

If an object is converted to an object, it is not modified. If a value of any other type is converted to an object, a new instance of the stdClass built-in class is created. If the value was NULL, the new instance will be empty. Arrays convert to an object with properties named by keys, and corresponding values. For any other value, a member variable named scalar will contain the value.



$obj = (object) 'ciao';     echo $obj->scalar;  // outputs 'ciao'     ?>


簡單的說,就是一個某種型別的值轉換成物件時候,就會建立一個stdClass的例項。再看文件中提供例子,一個標量型別的值,轉換成object。

進一步,如果執行如下程式碼:


echo '$obj instanceof stdClass=',($obj instanceof stdClass)?'Y':'N','
'
;

我們得到的結果是:

$obj instanceof stdClass=Y

也就是說轉變成物件的時候,是建立了一個stdClass,然後再動態新增屬性並且賦值。用var_dump方法也可以看出型別是stdClass。

理論上,我們可以手動的例項化一個stdClass,並透過var_dump檢視他。


$s=new stdClass();var_dump($s);?>

得到的結果就是

object(stdClass)[1]
也就是說stdClass既沒有屬性也沒有任何方法,是一個空的物件。
有不少人認為stdClass類似C#中的object,認為PHP中所有的類都繼承於stdClass,這是錯誤的,下面的程式碼就能說明問題了。

class Foo{}$foo = new Foo();echo ($foo instanceof stdClass)?'Y':'N';
因此可以總結如下:
stdClass是PHP保留的,沒有屬性也沒有任何方法的一個空物件,其作用就是為了在物件轉換時候,生成它,並且動態的新增屬性來完成物件的賦值。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2768/viewspace-2809779/,如需轉載,請註明出處,否則將追究法律責任。

相關文章