为什么SimpleXML对象的计算结果为布尔值TRUE?

时间:2011-11-08 12:16:06

标签: php simplexml

我是PHP和SimpleXMl的新手。

在这些测试中,我不会指望错误。

  $xml=new SimpleXMLElement('<a><b>123</b></a>');
  var_dump($xml);
  echo $xml ? "true": "false";

  $xml=new SimpleXMLElement('<a><b></b></a>');
  var_dump($xml);
  echo $xml ? "true": "false";

但是,即使返回了XMLSimpleElement对象,第二个返回false。 我的xml doc在任何地方都有名称空间存在同样的问题。

这意味着我无法测试失败的XML解析 if (!xml)返回false

$xml->childen($namespace)没有。

请指教 TIA 莲

3 个答案:

答案 0 :(得分:1)

我无法重现您的问题,但我会尝试提供一些提示。

首先,这是converting objects to booleans

时的规则
  

转换为布尔值时,以下值被视为FALSE
[...]特殊类型NULL(包括未设置的变量)
[...] SimpleXML对象空   标签

     

其他每个值都被视为TRUE(包括任何资源)。

其次,SimpleXMLElement constructor总是返回一个对象,但它可以抛出警告和异常。

所以这些是可能性:

// Casts as TRUE because it's an object
$xml=new SimpleXMLElement('<a><b>123</b></a>');
var_dump($xml, (bool)$xml);
unset($xml);

// Casts as FALSE because it's an SimpleXMLElement object for an empty tag
$xml=new SimpleXMLElement('<a />');
var_dump($xml, (bool)$xml);
unset($xml);

// Casts as FALSE because the $xml variable was never set sucessfully so it's not even set
try{
    $xml=new SimpleXMLElement('');
}catch(Exception $e){
}
var_dump($xml, (bool)$xml); // Notice: Undefined variable: xml
unset($xml);

答案 1 :(得分:0)

PHP(5+)中的对象评估为TRUE始终

一个例外是从空标记创建的SimpleXML个对象 - 请参阅http://php.net/manual/en/language.types.boolean.php

$xml = new SimpleXMLElement('<b></b>');

符合FALSE SimpleXML个对象(FALSE === (bool) $xml;)。

然而

$xml = new SimpleXMLElement('');

抛出异常,如果没有捕获,将暂停你的程序。如果被抓住,则未设置$xml

答案 2 :(得分:0)

您可以在http://www.php.net/manual/en/language.types.boolean.php上找到评估为真/假的所有内容(找到“当转换为布尔值时,以下值被视为FALSE:”)

如果SimpleXMLElement对象失败,则会抛出异常。以下代码应该满足您的需求:

try
{
    $xml=new SimpleXMLElement('');
    var_dump($xml);
    echo 'true';
}
catch
{
    echo 'false';
}

要评估为true / false,您可能会查看===,以显式计算为false。

$test = '';
echo $test ? 'true' : 'false'; // will output false
echo $test !== false ? 'true' : 'false'; // will output true