PHP迭代器类是如何工作的?

PHP迭代器类是如何工作的?,php,iterator,spl,Php,Iterator,Spl,尽管我可能会尝试,但我无法理解迭代器类的实际功能。我知道类可以实现可遍历,因此引擎知道它可以使用foreach进行循环,我意识到迭代器应该将任何可遍历的内容转换为迭代器,但我一生都无法理解如何实现 以班级为例,;如何实现标准迭代器方法(next、key、rewind等)以允许对PDO语句进行迭代 很抱歉,如果我的问题不清楚,我只是在努力掌握这个类的确切原因,关于它的文档也很少 谢谢 意志 更新:通过查看phpt文件,我发现了一个使用迭代器的测试: <?php $root = simple

尽管我可能会尝试,但我无法理解迭代器类的实际功能。我知道类可以实现可遍历,因此引擎知道它可以使用foreach进行循环我意识到迭代器应该将任何可遍历的内容转换为迭代器,但我一生都无法理解如何实现

以班级为例,;如何实现标准迭代器方法(next、key、rewind等)以允许对PDO语句进行迭代

很抱歉,如果我的问题不清楚,我只是在努力掌握这个类的确切原因,关于它的文档也很少

谢谢

意志

更新:通过查看phpt文件,我发现了一个使用迭代器的测试:

<?php

$root = simplexml_load_string('<?xml version="1.0"?>
<root>
    <child>Hello</child>
    <child>World</child>
</root>
');

foreach (new IteratorIterator($root->child) as $child) {
    echo $child."\n";
}

?>
我并不真正了解迭代器构造是如何将$root->child作为参数的,以及它是如何在子元素上进行迭代的。

我认为示例#2非常简单…
它基本上允许您为类实现下一个/previous/current/rewind/key数组函数的特定行为,这是php foreach解析器所期望的

因此,为了实现您的问题,可以创建一个迭代器类,其中PDOStatement作为其成员,而不是使用next方法调用PDOStatement::fetch以返回其下一条语句。存储它可以让您同时实现perivous和current。我没有太多地使用这个类,但我打赌实现倒带和键并不是那么难。请注意,这是动态的,因此在细节上我可能是错误的,但我认为概念应该是明确的,基于,我认为它允许您迭代迭代对象。也就是说,您可以在主对象中提取其他对象,并在主对象上使用迭代器迭代子对象

更新:基于您的更新。这对我来说是有意义的,尽管只有一个根对象,所以在本例中迭代它并不真正适用,但是如果有更多的根对象,您可以这样做。换句话说,我相信迭代器与嵌套foreach循环是一样的,不需要知道每个对象的所有元素。换句话说,使用面向对象对象的嵌套foreach。。。有一个多余的语句。:-)

如果你还没有找到,这里有几个例子可能会对你有所帮助


迭代器>

  • “此迭代器包装器允许 对任何存在的事物的转换 可遍历到迭代器中。”
可遍历>

  • “用于检测类是否为 可使用foreach进行遍历。”
  • “内部(内置)类 实现此接口即可使用 在foreach构造中,而不 需要实现IteratorAggregate吗 或迭代器。“
  • “这是一个内部引擎接口 无法在PHP中实现 脚本。迭代器聚合或 必须改用迭代器。”

该站点有一些递归迭代器示例,可能很方便,但是,如果我没有弄错的话,从脚本的角度来看,迭代器是非常无用的(至少在用于foreach时)

它从实现可遍历接口的对象中创建可迭代对象,但实现可遍历接口的intern类无论如何都是可foreach的,脚本无法实现可遍历的


(文档中未提及,SimpleXMLElement正在实现可遍历)

我不确定我是否遵循了。您链接到的示例讨论的是标准迭代器,而不是迭代器类()。你能澄清一下吗?我找到了答案。但在我看来,迭代器现在变得不重要了,不是吗?
Hello
World