Heim  >  Artikel  >  Backend-Entwicklung  >  用simplexml_load_string($xml_str)返回的对象访问不存在的属性,empty为true

用simplexml_load_string($xml_str)返回的对象访问不存在的属性,empty为true

WBOY
WBOYOriginal
2016-08-29 08:50:551207Durchsuche

<code>$xml_str = 
        <fee_type></fee_type>
        <return_code></return_code>
        <trade_type></trade_type>
    
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 = 
        <fee_type></fee_type>
        <return_code></return_code>
        <trade_type></trade_type>
    
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(),

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn