首頁  >  文章  >  後端開發  >  用simplexml_load_string($xml_str)傳回的物件存取不存在的屬性,empty為true

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

WBOY
WBOY原創
2016-08-29 08:50:551207瀏覽

<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(),

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn