PHP IteratorIterator类如何工作?

时间:2009-09-02 10:33:26

标签: php iterator spl

尽可能地尝试我无法理解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作为参数以及如何设法迭代子元素。

3 个答案:

答案 0 :(得分:2)

如果你还没找到,https://www.phpro.org/tutorials/Introduction-to-SPL.html有一些可能对你有帮助的例子。


IteratorIterator&gt;

  • “这个迭代器包装器允许 转换任何东西 可以穿越迭代器。“

Traversable&gt;

  • “用于检测类是否为的接口 可以使用foreach遍历。“
  • “内部(内置)类 实现此接口即可使用 在foreach构造中,不要 需要实现IteratorAggregate 或迭代者。“
  • “这是一个内部引擎界面 这不能用PHP实现 脚本。 IteratorAggregate或者 必须使用迭代器。“

该站点有一些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。我没有太多使用这个课程,但我敢打赌,实施倒带和关键并不是那么难。请注意,这是在飞行中所以我可能在细节上错了,但我认为这个概念应该是明确的