PHP 5.5在SimpleXMLElement上中断empty()


PHP 5.5 breaks empty() on SimpleXMLElement

我最近将我的PHP从5.3更新到5.5,并遇到了这个错误。

我的XML是:

<search-response>
  ...
  ...
  <results-count>12345</results-count>
</search-response>

如果我检查$value是否为空,它总是空的。他们改变了empty()方法吗?

$contents = file_get_contents(dirname(__FILE__). '/dummy.xml');
$xml = new SimpleXMLElement($contents);
function xpath_val($source_xml, $argument_array) {
  $result = array();
  foreach($argument_array as $k => $v){
    $node = $source_xml->xpath($v[0]); 
    if (empty($node)) {
      $value = $node;
    } else {
      $value = $node[0];
    }
    if (empty($value)) {
      $nodeval = '';
    } else {
      $nodeval = strval($value);
    }
    echo $nodeval;
  }
}
$arr = array();
$arr['info'] = xpath_val($xml,array(
  'count'  => array('/search-response/results-count','integer')
));
var_dump($arr);

编辑return$nodeval;而不是echo$nodeval;给出:

array(1) {
  ["info"]=>
  string(0) ""
}

是的,SimpleXMLElementempty状态从5.4开始发生了更改。在5.4之前,SimpleXMLElement表示与来自对象访问的元素相同的元素,与empty($element)的行为与来自SimpleXMLElement::xpath()方法结果数组的行为相同。

自从PHP 5.4以来,作为xpath结果对象的元素现在在使用empty检查时总是true(其他访问没有改变空行为)。

因此,您很可能不是在寻找empty($value),而是在寻找!strlen($value)

注意SimpleXMLElement有很多神奇之处,例如var_dumpprint_r不能很好地使用它。而且empty也有一些细微差别。

如果测试现有SimpleXMLElement的值,请将其强制转换为字符串。

如果要验证元素是否存在,请检查它的自引用是否为NULL。

还有一些关于5.3->5中断的错误报告。4使用SimpleXML:进行版本更改

  • 错误#62203-xpath不返回标记值(2012年6月)
  • 错误#62639-XML结构已损坏(2012年7月)
  • Bug#62717-BC:在PHP 5.4中,empty()为simplexmlelement报告true(2012年8月)