为什么PHP将这个DOM对象视为数组?

为什么PHP将这个DOM对象视为数组?,php,xml,domparser,php-7.3,Php,Xml,Domparser,Php 7.3,我将遵循本教程: 循环遍历XML部分是有问题的。 出于某种原因,PHP将DOM对象视为数组。此外,var_dump除了返回长度外,不返回任何关于对象属性的信息,但程序输出看起来好像不知从何而来。foreach可以通过某种方式循环对象吗?如果有,这些属性(节点名和节点值)包含在哪里,因为var_dump没有显示它们 $xml=new DOMDocument (); $xml->load('note.xml'); $array_of_nodes=$xml->documentEleme

我将遵循本教程:

循环遍历XML部分是有问题的。 出于某种原因,PHP将DOM对象视为数组。此外,var_dump除了返回长度外,不返回任何关于对象属性的信息,但程序输出看起来好像不知从何而来。foreach可以通过某种方式循环对象吗?如果有,这些属性(节点名和节点值)包含在哪里,因为var_dump没有显示它们

$xml=new DOMDocument ();
$xml->load('note.xml');

$array_of_nodes=$xml->documentElement->childNodes;

var_dump($array_of_nodes);

foreach($array_of_nodes as $item) {
    echo $item->nodeName."  ".$item->nodeValue."<br>";
}
$xml=newdomdocument();
$xml->load('note.xml');
$array\u of_nodes=$xml->documentElement->childNodes;
var_dump($array_of_节点);
foreach($节点数组作为$项){
echo$item->nodeName。“$item->nodeValue。”
”; }
Var dump函数返回以下内容:

object(DOMNodeList)#3(1){[“length”]=>int(9)}#text

但执行的代码如下所示:

for ($i = 0; $c = $nodeList->length; $i < $c; $i++) {
  $node = $nodeList->item($i);
  //...
}
正文= to=Tove

正文= from=Jani

正文= 标题=提醒

正文= 这个周末别忘了我

正文=
DOMNodeList
实现了几个接口:
Traversable
ArrayAccess
Countable
。这允许使用通用语法访问列表中的节点对象。如果没有它们,则需要使用以下特定方法和属性:

for ($i = 0; $c = $nodeList->length; $i < $c; $i++) {
  $node = $nodeList->item($i);
  //...
}
ArrayAccess
允许您使用数组语法按索引访问节点,它将
->项(…)
调用替换为
[…]

if (isset($nodeList[0])) {
  $node = $nodeList[0];
  //...
}
Countable
允许您使用
count($nodeList)
而不是
$nodeList->length

Traversable
对视觉的影响最大。它大大降低了呼叫的复杂性。但这只是第一个好处。您可以使用typehints或
instanceof
对接口进行验证。这将使代码解耦,使其更加健壮和可重用

但是,如果使用Xpath表达式,则通过DOM进行循环要容易得多。如果您以前使用过CSS选择器,则可以将Xpath表达式视为更强大的同级表达式

$document = new DOMDocument();
$document->load('note.xml');
$xpath = DOMXpath($document);

foreach($xpath->evaluate('/note') as $item) {
    echo 'To: ', $xpath->evaluate('string(to)', $item), "\n";
    echo 'From: ', $xpath->evaluate('string(from)', $item), "\n";
    echo 'Title: ', $xpath->evaluate('string(heading)', $item), "\n";
    echo 'Text: ', $xpath->evaluate('string(body)', $item), "\n";
}

childNodes
DOMNodeList
类型的属性。var_dump没有显示任何关于它的内容,原因很简单,因为var_dump只显示开发人员通过调用以下C函数声明的类属性

ZEND_API int zend_declare_property(...)
ZEND_API int zend_declare_property_null(...)
ZEND_API int zend_declare_property_bool(...)
ZEND_API int zend_declare_property_long(...)
ZEND_API int zend_declare_property_double(...)
ZEND_API int zend_declare_property_string(...)
ZEND_API int zend_declare_property_stringl(...)
资料来源:akond的答复:

也就是说,DOM扩展的开发人员选择不公开
DOMNodeList
类的结构

之所以可以遍历
DOMNodeList
,是因为它实现了
Traversable
接口,该接口表示可以通过使用
foreach

来遍历类,该对象就像数组一样是可遍历的
foreach ($nodeList as $node) {
  //...
}