用simplexml_load_string($xml_str)傳回的物件存取不存在的屬性,empty為true

WBOY
發布: 2016-08-29 08:50:55
原創
1250 人瀏覽過

<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卻有結果,什麼原因?
用simplexml_load_string($xml_str)傳回的物件存取不存在的屬性,empty為true

回覆內容:

<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卻有結果,什麼原因?
用simplexml_load_string($xml_str)傳回的物件存取不存在的屬性,empty為true

雖然game屬性不存在,但是直接取得這個屬性時,會呼叫SimpleXMLElement的魔術方法__get(),這個方法回傳了一個空對象,並被var_dump印了出來。
但是物件在empty()判斷時應該為真呀,為什麼這裡是假呢?
因為empty()並不等於直接的布林判斷,而是empty($var) === isset($var) && $var,所以這裡會先調用SimpleXMLElement的魔術方法__isset( ),而__isset()回傳了這個屬性不存在,後面的__get()就自動被跳過了。

因為simplexmlelement內部實現了settergetter, 就像魔術方法 __set()__get(),

相關標籤:
php
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板