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 是否为空,它总是为空。虽然这在 PHP 5.3 中有效。他们是否更改了 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 $节点;而不是 echo $nodeval;给出:
array(1) {
["info"]=>
string(0) ""
}
是的,从 5.4 开始,SimpleXMLElement 的 empty
状态发生了变化。在 5.4 之前,SimpleXMLElement 表示与来自对象访问相同的元素,与 empty($element)
的行为相同,与来自 SimpleXMLElement::xpath()
方法结果数组的元素相同。
从 PHP 5.4 开始,当用 empty
检查时,作为 xpath 结果对象的元素现在总是 true
(其他访问没有改变空行为)。
您很可能不是在寻找 empty($value)
,而是在寻找 !strlen($value)
。
注意 SimpleXMLElement 有很多神奇之处,例如 var_dump
和 print_r
不能很好地使用它。 empty
也有一些细微差别。
如果您测试 现有 SimpleXMLElement 的值,请将其转换为字符串。
如果要验证元素是否存在,请检查它的自引用是否为 NULL。
还有一些关于 5.3 -> 5. 4 版本更改与 SimpleXML 的中断的错误报告:
- Bug #62203 - xpath doesn't return tag values(2012 年 6 月)
- Bug #62639 - XML structure broken(2012 年 7 月)
- Bug #62717 - BC: in PHP 5.4 empty() reports true for simplexmlelement(2012 年 8 月)
我最近将我的 PHP 从 5.3 更新到 5.5 并遇到了这个错误。
我的XML是:
<search-response>
...
...
<results-count>12345</results-count>
</search-response>
如果我检查 $value 是否为空,它总是为空。虽然这在 PHP 5.3 中有效。他们是否更改了 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 $节点;而不是 echo $nodeval;给出:
array(1) {
["info"]=>
string(0) ""
}
是的,从 5.4 开始,SimpleXMLElement 的 empty
状态发生了变化。在 5.4 之前,SimpleXMLElement 表示与来自对象访问相同的元素,与 empty($element)
的行为相同,与来自 SimpleXMLElement::xpath()
方法结果数组的元素相同。
从 PHP 5.4 开始,当用 empty
检查时,作为 xpath 结果对象的元素现在总是 true
(其他访问没有改变空行为)。
您很可能不是在寻找 empty($value)
,而是在寻找 !strlen($value)
。
注意 SimpleXMLElement 有很多神奇之处,例如 var_dump
和 print_r
不能很好地使用它。 empty
也有一些细微差别。
如果您测试 现有 SimpleXMLElement 的值,请将其转换为字符串。
如果要验证元素是否存在,请检查它的自引用是否为 NULL。
还有一些关于 5.3 -> 5. 4 版本更改与 SimpleXML 的中断的错误报告:
- Bug #62203 - xpath doesn't return tag values(2012 年 6 月)
- Bug #62639 - XML structure broken(2012 年 7 月)
- Bug #62717 - BC: in PHP 5.4 empty() reports true for simplexmlelement(2012 年 8 月)