为何SimpleXMLElement对一级不存在XML元素返回空对象,下层却返回NULL?
解释SimpleXMLElement的层级访问行为
先看你给出的代码示例:
$xml = simplexml_load_string('<root><Foo></Foo></root>'); echo "Type of A: " . gettype($xml->Foo->A) . PHP_EOL; // object echo "Type of B: " . gettype($xml->Foo->A->B) . PHP_EOL; // NULL echo "Type of C: " . gettype($xml->Foo->A->B->C) . PHP_EOL; // Warning because of property access on NULL var_dump($xml->Foo->A); //object(SimpleXMLElement)#4 (0) {}
核心原因:SimpleXML的设计逻辑
- 当访问已存在节点的直接子元素(即便该子元素不存在)时,SimpleXML会返回一个空的SimpleXMLElement对象。这是刻意的设计——它允许你直接通过这个空对象链式调用
addChild()等方法,动态创建对应的XML节点,不用提前判断元素是否存在。 - 但当你访问空SimpleXMLElement对象的子元素时,因为这个空对象本身不对应任何实际存在的XML节点,SimpleXML无法生成有效的子元素对象,所以直接返回
NULL。 - 后续再访问
NULL的属性时,自然会触发PHP的“在NULL上访问属性”警告。
简单总结:一级不存在的子元素是用于后续创建节点的占位对象,而它的子元素因为没有有效父节点支撑,直接返回NULL。
内容的提问来源于stack exchange,提问作者tweekz
相关产品推荐
相关产品推荐

