php - 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
解决方案
如果您在这里查看该类的源代码,您可以看到它实现了两个接口,定义如下:
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()
。
推荐阅读
- flutter - 漂浮在其容器外的图片颤动
- flutter - 构建apk时这些乱码是什么?
- java - 读取二进制文件中的约会对象在打印字符串中包含类名和大括号
- python - 如何手动覆盖选择 keras 超参数?
- typescript - × TypeError: Cannot read properties of undefined (reading 'indexOf')
- javascript - Javascript 查询选择器不适用于 HTML
- javascript - 当其 isDisabled 时更改背景颜色基础 React-select
- regex - Dreamweaver 中的正则表达式:错误?
- javascript - 您可以在不参考运行或编译时间的情况下定义静态和动态语言吗?
- c# - StackOverflow 与 C# 中的随机名称生成器