根据 PHP 手册,这两个参数已在 PHP 5.2 版本中添加。官方的 PHP 5 更新日志没有明确记录这些更改,而是 the PHP 5.2 update readme has these。
然后查看构造函数 (in lxr) 的 5.2 源代码,它表明这与迭代器有关:
sxe->iter.nsprefix = ns_len ? xmlStrdup((xmlChar *)ns) : NULL;
sxe->iter.isprefix = isprefix;
所以我假设这两个指定了 SimpleXMLElement 将在 默认情况下 迭代的 XML 命名空间。一个小测试可以验证这一点:
$xml = new SimpleXMLElement(
'<root><a/><b/><c/></root>'
);
var_dump(count(iterator_to_array($xml))); #int(3)
默认情况下,迭代器在此处具有三个元素:a、b 和 c。现在将指定迭代的参数设置为与默认值不同的 XML 命名空间会改变这一点:
$xml = new SimpleXMLElement(
'<root><a/><b/><c/></root>', 0, FALSE, "ns:1"
);
var_dump(count(iterator_to_array($xml))); #int(0)
迭代现在有零个元素,因为根元素在 URI ns:1 的命名空间中没有任何子元素。
将根元素的命名空间更改为ns:1 将再次显示三个元素,因为现在这三个子元素位于该命名空间中,它们从其父元素继承:
$xml = new SimpleXMLElement(
'<root xmlns="ns:1"><a/><b/><c/></root>', 0, FALSE, "ns:1"
);
var_dump(count(iterator_to_array($xml))); #int(3)
就像孩子本身在该参数对指定的命名空间中一样,并且通过这些元素上的前缀:
$xml = new SimpleXMLElement(
'<root xmlns:n="ns:1"><n:a/><n:b/><n:c/></root>', 0, FALSE, "ns:1"
);
var_dump(count(iterator_to_array($xml))); #int(3)