動態屬性不是PHP專有的,很多解釋型語言都有這個功能,比如javascript。它可以動態為其對象添加刪除屬性。PHP也可以動態添加屬性,如下面的例子:
class testClass{public $A='a';}$t=new testClass();echo $t->A,'<br>';echo 'B isset=',isset($t->B)?'Y':'N','<br>';//$t中並沒有變數B$t->B='b';//$t中給添加了變數B,並且賦值。echo 'B isset=',isset($t->B)?'Y':'N','<br>';echo '$t->B=',$t->B,'<br>';unset($t->B);//$t中給刪除變數B。echo 'B isset=',isset($t->B)?'Y':'N','<br>';
這讓人想起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.
<?php $obj = (object) 'ciao'; echo $obj->scalar; // outputs 'ciao' ?>
簡單的說,就是一個某種類型的值轉換成對象時候,就會建立一個stdClass的執行個體。再看文檔中提供例子,一個標量類型的值,轉換成object。
進一步,如果運行如下代碼:
echo '$obj instanceof stdClass=',($obj instanceof stdClass)?'Y':'N','<br>';
我們得到的結果是:
$obj instanceof stdClass=Y
也就是說轉變成對象的時候,是建立了一個stdClass,然後再動態添加屬性並且賦值。用var_dump方法也可以看出類型是stdClass。
理論上,我們可以手動的執行個體化一個stdClass,並通過var_dump查看他。
<?php$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保留的,沒有屬性也沒有任何方法的一個Null 物件,其作用就是為了在對象轉換時候,產生它,並且動態添加屬性來完成對象的賦值。
參考文檔:
http://krisjordan.com/dynamic-properties-in-php-with-stdclass
http://php.net/manual/en/language.types.object.php
本文出自 “一隻部落格” 部落格,請務必保留此出處http://cnn237111.blog.51cto.com/2359144/1301423