成功解析SimpleXMLElement与'false'的比较返回'true'
我对simplexml评估有一个非常尴尬和特殊的问题。成功解析SimpleXMLElement与'false'的比较返回'true'
代码:
$simplexml = simplexml_load_string($xmlstring);
var_dump($simplexml);
var_dump($simplexml == false); //this comparison
的var_dump($ simplexml的)返回simplexml的我的实际结构,但比较返回“真”这个特定的SimpleXML,这是我无法证明,因为我的合同结构。
我敢肯定,这是非常特定的问题,因为我尝试了其他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'之间进行比较的可能原因是什么?
看一看这里: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting
它说,从空标签创建的SimpleXML对象评估为假。也许这就是发生了什么?
我这个,这是一个更好的方式使用布尔铸造做(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
===
比较值,并键入...除非对象,其中===
是,如果两个操作数独一的真实际上是同一个对象!对于对象,==
比较每个属性的值和类型,这是===
对每个其他类型所做的。
EDIT 1
我的XML有太多层次,直到文本节点和父SimpleXMLElement被认为是空的,所以转换仍然会返回'false',导致比较返回'true'。感谢您的回答 – 2012-04-13 11:35:29
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 */ }
这正是发生了什么事情。我再次做了测试,现在一切都变得有意义了。我只是不知道没有文本值的父标记带有儿童标记带/不带文本值被认为是空的。谢谢 – 2012-04-13 11:19:16
可能发生这种情况是因为我在文本节点之前得到了太多层次。 – 2012-04-13 11:37:19