天天看點

PHP動态屬性和stdclass

動态屬性不是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保留的,沒有屬性也沒有任何方法的一個空對象,其作用就是為了在對象轉換時候,生成它,并且動态的添加屬性來完成對象的指派。