尽可能地尝试我无法理解IteratorIterator类实际上做的事情。我知道类可以实现Traversable,所以引擎知道它可以使用foreach循环和我意识到IteratorIterator应该将Traversable中的任何东西转换为Iterator但我不能在生活中理解如何。
以PDOStatement类为例;如何实现标准迭代器方法(下一步,密钥,倒带等)以允许迭代PDOStatement?
很抱歉,如果我的问题不清楚,我只是在努力掌握这门课程的确切原因,而且关于它的文档很少。
谢谢,
威尔
更新:通过phpt文件,我发现了一个使用IteratorIterator的测试:
<?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";
}
?>
预期输出为:
Hello
World
我并没有真正遵循IteratorIterator构造如何将$ root-&gt; child作为参数以及如何设法迭代子元素。
答案 0 :(得分:2)
如果你还没找到,https://www.phpro.org/tutorials/Introduction-to-SPL.html有一些可能对你有帮助的例子。
IteratorIterator&gt;
Traversable&gt;
该站点有一些RecursiveIteratorIterator示例可能很方便但是,如果我做对了,IteratorIterator从脚本的角度来看是非常无用的(至少用于foreach)。
它从实现Traversable接口的对象中创建可迭代对象,但实现Traversable接口的实习类无论如何都是可以预先安装的,脚本无法实现Traversable ......
(在文档中没有提到,SimpleXMLElement正在实现Traversable)
答案 1 :(得分:1)
基于this,我认为它允许您迭代迭代对象。即您可以在主对象中拉出其他对象并在主对象上使用IteratorIterator,也可以迭代子对象。
更新:根据您的更新。这对我来说很有意义,虽然只有一个根对象,所以迭代它并不适用于这个例子,但是如果有更多的根对象你就可以了。换句话说,我相信IteratorIterator与嵌套的foreach循环相同,而不必知道每个对象的所有元素。换句话说,使用面向对象的对象的嵌套foreach ......有一个冗余语句。 : - )
答案 2 :(得分:0)
我认为例子#2 here非常直接...... 它基本上允许您为您的类实现下一个/上一个/当前/回放/键数组函数的特定行为,这是php foreach解析器所期望的。
因此,为了实现您的问题,可以使用PDOStatement创建一个Iterator类作为其代码,例如使用下一个方法调用PDOStatement :: fetch返回其下一个语句。存储它将让你实现periveous和current。我没有太多使用这个课程,但我敢打赌,实施倒带和关键并不是那么难。请注意,这是在飞行中所以我可能在细节上错了,但我认为这个概念应该是明确的