首页 > 解决方案 > PHP:循环遍历一个对象循环遍历成员数组

问题描述

foreach ($pElements as $pElement) {
  var_dump($pElement);
}

如果我执行上述操作,我注意到它会转储“节点”数组中的每个值,即使它$pElement是一个对象。谁能解释这种行为?

起初我以为foreach在对象上运行会自动搜索成员数组,但第一个列出的数组namespaces似乎被忽略了。

这是完整的对象$pElements

/var/www/html/phpTestArea/index.php:35:
object(Symfony\Component\DomCrawler\Crawler)[38]
  protected 'uri' => null
  private 'defaultNamespacePrefix' => string 'default' (length=7)
  private 'namespaces' => 
    array (size=0)
      empty
  private 'baseHref' => null
  private 'document' => 
    object(DOMDocument)[2]
      public 'doctype' => string '(object value omitted)' (length=22)
      public 'implementation' => string '(object value omitted)' (length=22)
      <public properties removed>
  private 'nodes' => 
    array (size=2)
      0 => 
        object(DOMElement)[36]
        <public properties removed>              
      1 => 
        object(DOMElement)[35]
        <public properties removed>
  private 'isHtml' => boolean true

标签: php

解决方案


如果您在这里查看该类的源代码,您可以看到它实现了两个接口,定义如下:

Countable:这定义了类的实例在传递给本机 phpcount函数时应该如何表现。计数取决于实现。

interface Countable {
    abstract public count(void): int
}

IteratorAggregate:这是一个返回迭代器(扩展 Traversable)的迭代器,它定义了如何以及应该遍历什么。

interface IteratorAggregate extends Traversable {
    abstract public getIterator(void): Traversable
}

因此,如果您仔细查看这两个函数的源代码,您将看到它们是如何实现的:

/**
 * @return int
 */
public function count()
{
    return \count($this->nodes);
}

/**
 * @return \ArrayIterator|\DOMElement[]
 */
public function getIterator()
{
    return new \ArrayIterator($this->nodes);
}

因此,如果您调用count($pElements),将执行对象的内部计数函数,因此您将获得nodes属性的计数。

同样,如果您使用 foreach over$pElements进行迭代,您就是在对nodes属性进行迭代,因为这是由 定义的行为getIterator()


推荐阅读