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
答案 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()
定义的行为。