PHP動態屬性和stdclass

來源:互聯網
上載者:User

動態屬性不是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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.