Php 比较运算符行为不端

Php 比较运算符行为不端,php,Php,就在前几天,我正在制作一个函数,该函数将从远程服务器提取一个XML文件,在成功检索后,它将返回一个SimpleXMLElement对象,或者如果由于网络故障无法获取该信息,则返回false 一种常见但懒惰的做法是使用if检查来检查函数响应,以确保变量中是否有内容。 下面的代码可能会更好地解释我想说的话 <?php $xmlString = "<?xml version='1.0' standalone='yes'?><root><node>A<

就在前几天,我正在制作一个函数,该函数将从远程服务器提取一个XML文件,在成功检索后,它将返回一个SimpleXMLElement对象,或者如果由于网络故障无法获取该信息,则返回false

一种常见但懒惰的做法是使用if检查来检查函数响应,以确保变量中是否有内容。 下面的代码可能会更好地解释我想说的话

<?php 


$xmlString = "<?xml version='1.0' standalone='yes'?><root><node>A</node></root>";
$xmlElement = new SimpleXMLElement($xmlString);

var_dump($xmlElement);
//Shows an xml element that is not empty 

var_dump((bool)$xmlElement);
//Returns true

if($xmlElement)
{
    //Executions comes inside
    echo "i`m true";
}


var_dump($xmlElement == false);
//Strangely this is also true


?> 

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

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

适用于布尔人的PHP文档:

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

  • 布尔值本身是假的
  • 整数0(零)
  • 浮动0.0(零)
  • 空字符串和字符串“0”
  • 零元素数组
  • 具有零成员变量的对象(仅限PHP 4)
  • 特殊类型NULL(包括未设置的变量)
  • 从空标记创建的SimpleXML对象
我做了一些调查()

这是第一条评论:

要进一步阐述之前的评论并将重点集中在以下方面:

SimpleXMLElement很难使用,因为它感觉和>的行为类似于一个对象,但实际上是一个系统资源(特别是一个>libxml资源)

这就是为什么您不能将SimpleXMLElement存储到$\u会话或对节点值执行>直接比较操作,而不首先将它们强制转换为>某种类型的对象$_会话需要存储“一个对象”,比较>运算符需要比较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 ?

我不认为它是重复的,元素不是空的。更奇怪的是,将元素强制转换为bool会导致
true
:你是对的@jeroen。。奇怪的行为..实际上我尝试了var_dump((bool)$xmlement==false)并且它工作了…不是我的dv,但是你需要使用英语。对此很抱歉…你应该尝试一个
var_dump((bool)$xmlement)只是为了好玩:-)所以你说,如果在我们的例子中var_dump((bool)$xmlement)=>bool(true)不是空的,那么将资源类型转换为布尔值将为true,但是在这个语句中,var_dump($xmlement==false)当它尝试执行相同的操作时,它会转换为false?我猜$xmlElement的隐式转换没有正确执行,可能是因为它不是一个真正的对象,而是一个ressource。。。