【问题标题】:Successfully parsed SimpleXMLElement comparison to 'false' returning 'true'成功解析 SimpleXMLElement 比较到 'false' 返回 'true'
【发布时间】:2012-04-12 20:11:00
【问题描述】:

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

【问题讨论】:

    标签: php xml comparison simplexml


    【解决方案1】:

    这是使用布尔转换(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。感谢您的回答
    【解决方案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 */ }
    

    【讨论】:

      【解决方案3】:

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

      它表示从空标签创建的 SimpleXML 对象的计算结果为 false。也许这就是发生了什么?

      【讨论】:

      • 这正是正在发生的事情。我再次进行了测试,现在一切都变得有意义了。我只是不知道没有文本值的父标签具有带/不带文本值的子标签被认为是空的。谢谢
      • 可能是因为我在文本节点之前获得了太多关卡。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 2016-02-13
      • 1970-01-01
      相关资源
      最近更新 更多