PHP:在对象上循环在成员数组上循环

时间:2019-04-08 21:14:03

标签: php

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

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

起初,我以为在对象上运行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

1 个答案:

答案 0 :(得分:1)

如果您查看该类here的源代码,您会发现它实现了两个接口,定义如下:

可计数:这定义了将类的实例传递给本地php count函数时的行为。计数取决于实现方式。

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

IteratorAggregate :这是一个返回迭代器(扩展了Traversable)的迭代器,该迭代器定义了如何遍历 。 >

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

因此,如果您仔细查看这两个功能的source code,您将看到它们的实现方式:

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

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

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

以同样的方式,如果在$pElements上进行foreach迭代,则在nodes属性上进行迭代,因为这是getIterator()定义的行为。