比较操作员行为不端

时间:2016-02-26 12:14:47

标签: php

就在前几天,我正在创建一个从远程服务器中提取XML文件的函数,一旦成功检索,它将返回一个SimpleXMLElement对象,如果无法获取该信息,则返回false网络故障。

一种常见但懒惰的做法是使用if检查来检查函数响应,以确定变量中是否存在某些内容。 可能下面的代码将试图更好地解释我想说的是什么

[25.0, 193.0, 281.75, 87.5, 80.5, 449.75, 306.25, 281.75, 87.5, 675.5,986.125, 306.25, 281.75]

有人可以解释为什么比较运算符的结果是布尔值(true)

2 个答案:

答案 0 :(得分:0)

var_dump($xmlElement == false)

我们比较$ xmlElement和值False。因此,如果$ xmlElement为False,则比较将为True(false == false)。 PHP需要将$ xmlElement转换为boolean。

针对布尔值的PHP文档: http://php.net/manual/en/language.types.boolean.php

  

转换为布尔值时,以下值被视为FALSE:

     
      
  • 布尔值FALSE本身
  •   
  • 整数0(零)
  •   
  • 浮点数0.0(零)
  •   
  • 空字符串,字符串" 0"
  •   
  • 包含零元素的数组
  •   
  • 一个零成员变量的对象(仅限PHP 4)
  •   
  • 特殊类型NULL(包括未设置的变量)
  •   
  • 从空标记创建的SimpleXML对象
  •   

答案 1 :(得分:0)

我做了一些研究(http://php.net/manual/en/class.simplexmlelement.php)。

这句话是第一条评论:

  

进一步发表先前的评论并推动重点:

     

使SimpleXMLElement难以处理的原因是它感觉并且>行为像一个对象,但实际上是一个系统RESOURCE(特别是一个> libxml资源)。

     

这就是为什么你不能将SimpleXMLElement存储到$ _SESSION或对节点值执行>直接比较操作而不首先将它们转换为>某种类型的对象。 $ _SESSION期望存储'对象'并且比较>运算符期望比较2'对象'而SimpleXMLElements不是>对象。

     

当您回显或打印节点的值时,PHP会将值(资源)>转换为字符串对象。这肯定是一个节省时间,但可以欺骗你>认为你的SimpleXMLElement是一个对象。

     

希望这有助于澄清

显然你的对象是一个资源。我的猜测是这是一个PHP错误......

var_dump((bool) $xmlElement) => bool(True)
var_dump($xmlElement == false) => bool(True) //No reason
var_dump((bool) $xmlElement == false) => bool(False) //Why is behavior different ?