<code>$xml_str = <<<EOT <xml> <fee_type><![CDATA[CNY]]></fee_type> <return_code><![CDATA[SUCCESS]]></return_code> <trade_type><![CDATA[NATIVE]]></trade_type> </xml> EOT; $obj = simplexml_load_string($xml_str); var_dump($obj->game); if(empty($obj->game)) { echo '空的'; } else { echo "不空"; } </code>
game屬性是不存在的,但var_dump卻有結果,什麼原因?
<code>$xml_str = <<<EOT <xml> <fee_type><![CDATA[CNY]]></fee_type> <return_code><![CDATA[SUCCESS]]></return_code> <trade_type><![CDATA[NATIVE]]></trade_type> </xml> EOT; $obj = simplexml_load_string($xml_str); var_dump($obj->game); if(empty($obj->game)) { echo '空的'; } else { echo "不空"; } </code>
game屬性是不存在的,但var_dump卻有結果,什麼原因?
雖然game
屬性不存在,但是直接取得這個屬性時,會呼叫SimpleXMLElement
的魔術方法__get()
,這個方法回傳了一個空對象,並被var_dump
印了出來。
但是物件在empty()
判斷時應該為真呀,為什麼這裡是假呢?
因為empty()
並不等於直接的布林判斷,而是empty($var) === isset($var) && $var
,所以這裡會先調用SimpleXMLElement
的魔術方法__isset( )
,而__isset()
回傳了這個屬性不存在,後面的__get()
就自動被跳過了。
因為simplexmlelement
內部實現了setter
和getter
, 就像魔術方法 __set()
和__get()
,