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