成功解析SimpleXMLElement与“false”进行比较返回“true”。

3

我是一名有用的助手,可以为您翻译文本。

我收到了一个非常尴尬而具体的问题,涉及simplexml评估。

代码:

$simplexml = simplexml_load_string($xmlstring);
var_dump($simplexml);
var_dump($simplexml == false); //this comparison

var_dump($simplexml) 返回我的simplexml的实际结构,但是对于这个特定的simplexml,比较返回'true',我无法展示结构,因为合同限制。
我确定这是非常具体的问题,因为我尝试了其他XML字符串,比较返回'false'。

$simplexml = simplexml_load_string('<a><b>test</b></a>');
var_dump($simplexml); //returns the actual structure
var_dump($simplexml == false); //returns false

我使用 '===' 运算符解决了这个问题,但只是让它工作并不满意。我想要理解为什么 '==' 运算符会返回 true。
我阅读了关于两个运算符和 SimpleXMLElement 的文章,根据我的观察,它们都应该返回 'false'。
当成功解析的 SimpleXMLElement 和布尔值 'false' 进行比较时,可能导致返回 'true' 的可能原因有哪些?

3个回答

2

我认为使用布尔转换 (bool) 是更好的方法来实现它。

$simplexml = simplexml_load_string('<a><b>test</b></a>');
var_dump($simplexml); //returns the actual structure
var_dump((bool) $simplexml); // Retuns true
var_dump((bool) $simplexml == false); //returns false
var_dump((bool) $simplexml === false); //returns false   

演示:http://codepad.viper-7.com/xZtuNG

===比较值和类型...但对于对象,只有当两个操作数实际上是同一个对象时,===才为真!对于对象,==比较每个属性的值(即所有属性的值)和类型,这就是 === 适用于其他每种类型的情况。

编辑 1

请参阅类似功能的最新错误https://bugs.php.net/bug.php?id=54547


我的XML有太多层级,直到文本节点,这使得父SimpleXMLElement被视为空,因此转换仍将返回“false”,导致比较返回“true”。感谢您的答案。 - Philipe Felix

2
var_dump($simplexml == false); //returns false

这是预期的行为,它通过“松散”的数据类型比较来解释。在PHP中,NULL、零和布尔值FALSE被认为是“Falsy”值;其他所有值都被认为是“Truthy”。在括号内,PHP执行表达式的评估。在这种情况下,PHP评估了所命名的变量OBJECT和布尔值FALSE之间的比较。它们不相同,因此比较的返回值为FALSE,这就是*var_dump()*打印的内容。
您可以在if()语句中利用这个特性。例如:
$simplexml = SimpleXML_Load_String('<a><b>test</b></a>');
if ($simplexml) { /* process the object */ }
else { /* process the failure to load the XML */ }

1

这正是发生的事情。我重新进行了测试,现在一切都有意义了。我只是不知道一个没有文本值但具有带/不带文本值的子标记的父标记被认为是空的。谢谢。 - Philipe Felix
可能是因为我在文本节点中有太多层级了。 - Philipe Felix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接