用simplexml_load_string($xml_str)返回的对象访问不存在的属性,empty为true
程序员文章站
2024-01-03 11:18:40
...
$xml_str =
EOT;
$obj = simplexml_load_string($xml_str);
var_dump($obj->game);
if(empty($obj->game)) {
echo '空的';
} else {
echo "不空";
}
game属性是不存在的,但var_dump却有结果,什么原因?
回复内容:
$xml_str =
EOT;
$obj = simplexml_load_string($xml_str);
var_dump($obj->game);
if(empty($obj->game)) {
echo '空的';
} else {
echo "不空";
}
game属性是不存在的,但var_dump却有结果,什么原因?
虽然game
属性不存在,但是直接获取这个属性时,会调用SimpleXMLElement
的魔术方法__get()
,这个方法返回了一个空对象,并被var_dump
打印了出来。
但是对象在empty()
判断时应该为真呀,为什么这里是假呢?
因为empty()
并不等于直接的布尔判断,而是empty($var) === isset($var) && $var
,所以这里会先调用SimpleXMLElement
的魔术方法__isset()
,而__isset()
返回了这个属性不存在,后面的__get()
就自动被跳过了。
因为simplexmlelement
内部实现了setter
和getter
, 就像魔术方法 __set()
和__get()
,