2012-04-12 106 views
3

我对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'之间进行比较的可能原因是什么?

回答

1

看一看这里: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

它说,从空标签创建的SimpleXML对象评估为假。也许这就是发生了什么?

+0

这正是发生了什么事情。我再次做了测试,现在一切都变得有意义了。我只是不知道没有文本值的父标记带有儿童标记带/不带文本值被认为是空的。谢谢 – 2012-04-13 11:19:16

+0

可能发生这种情况是因为我在文本节点之前得到了太多层次。 – 2012-04-13 11:37:19

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

===比较值,并键入...除非对象,其中===是,如果两个操作数独一的真实际上是同一个对象!对于对象,==比较每个属性的值和类型,这是===对每个其他类型所做的。

EDIT 1

参见类似https://bugs.php.net/bug.php?id=54547

+0

我的XML有太多层次,直到文本节点和父SimpleXMLElement被认为是空的,所以转换仍然会返回'false',导致比较返回'true'。感谢您的回答 – 2012-04-13 11:35:29

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 */ } 
相关问题