PHP動態屬性和stdclass
動態屬性不是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.
|
簡單的說,就是一個某種型別的值轉換成物件時候,就會建立一個stdClass的例項。再看文件中提供例子,一個標量型別的值,轉換成object。
進一步,如果執行如下程式碼:
echo '$obj instanceof stdClass=' ,( $obj instanceof stdClass)? 'Y' : 'N' , ' ;
|
我們得到的結果是:
$obj instanceof stdClass=Y
也就是說轉變成物件的時候,是建立了一個stdClass,然後再動態新增屬性並且賦值。用var_dump方法也可以看出型別是stdClass。
理論上,我們可以手動的例項化一個stdClass,並透過var_dump檢視他。
|
得到的結果就是
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PHP stdClass Object轉arrayPHPObject
- JS/JQ動態建立(新增)optgroup和option屬性JS
- C#-----ExpandoObject動態屬性C#Object
- 三、動態繫結屬性
- Laravel 動態屬性的實現Laravel
- 類的靜態屬性和方法
- 深入理解JavaScript類與物件:揭秘類欄位和靜態屬性的妙用,js靜態屬性和例項屬性JavaScript物件JS
- 靜態屬性
- Python 動態新增例項屬性,例項方法,類屬性,類方法Python
- defer 屬性和 async 屬性
- SVG accumulate和additive動畫屬性SVG動畫
- Python學習之路38-動態建立屬性Python
- jQuery動態修改連結的href屬性值jQuery
- 動態生成HTML元素併為元素追加屬性HTML
- 動態修改Shape的solid屬性的color值Solid
- VueJs中動態更改svg的相關屬性VueJSSVG
- TypeScript 類靜態屬性TypeScript
- PHP中把stdClass Object轉array的幾個方法PHPObject
- 屬性動畫動畫
- SpringBoot中根據屬性動態註冊Spring BeanSpring BootBean
- v-bind 動態更新 HTML 元素上的屬性HTML
- JavaScript 靜態屬性與靜態方法JavaScript
- 屬性和方法
- PHP 物件導向 (二)類屬性PHP物件
- vue計算屬性和vue實力的屬性和方法Vue
- 【Vue】計算屬性 監聽屬性 元件通訊 動態元件 插槽 vue-cli腳手架Vue元件
- React Native 探索(三)元件的 Props (屬性) 和 State (狀態)React Native元件
- android屬性動畫Android動畫
- 屬性和監聽
- SVG剪下蒙版屬性clip-path實戰,動態蒙版+動態圖形,動動組合SVG
- jackson根據屬性名動態序列化物件欄位物件
- 動態建立節點並且給建立的元素新增屬性
- render函式處理動態獲取img的src屬性函式
- Android 動畫詳解:屬性動畫、View 動畫和幀動畫Android動畫View
- SVG 動畫 fill 屬性SVG動畫
- SVG restart 動畫屬性SVGREST動畫
- SVG restart動畫屬性SVGREST動畫
- 盒子屬性,及浮動