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”的可能原因是什么?

4

3 回答 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

===比较值和类型……除了对象, where===仅当两个操作数实际上是同一个对象时才为真!对于对象,==比较(每个属性的)值和类型,这===对其他所有类型都是如此。

编辑 1

请参阅有关类似内容的最新错误https://bugs.php.net/bug.php?id=54547

于 2012-04-12T20:24:09.460 回答
2
var_dump($simplexml == false); //returns false

这是预期的行为,它通过“松散”数据类型的数据比较来解释。在 PHP 中,NULL、零和布尔 FALSE 被认为是“假”值;其他一切都被认为是“真实的”。在括号内,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-12-16T13:51:18.463 回答
1

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

它说从空标签创建的 SimpleXML 对象评估为假。也许这就是正在发生的事情?

于 2012-04-12T20:18:06.860 回答