5

尽我所能,我无法理解 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->child 作为参数以及它如何设法遍历子元素。

4

3 回答 3

2

如果您还没有找到它,https://www.phpro.org/tutorials/Introduction-to-SPL.html有一些示例可能会对您有所帮助。


迭代器迭代器 >

  • “这个迭代器包装器允许将任何可遍历的东西转换为迭代器。”

可遍历 >

  • “检测一个类是否可以使用 foreach 遍历的接口。”
  • “实现此接口的内部(内置)类可以在 foreach 构造中使用,不需要实现 IteratorAggregate 或 Iterator。”
  • “这是一个无法在 PHP 脚本中实现的内部引擎接口。必须使用 IteratorAggregate 或 Iterator。”

该站点有一些 RecursiveIteratorIterator 示例可能很方便,但如果我做对了,从脚本的角度来看,IteratorIterator 非常无用(至少在用于 foreach 时)。

它从实现 Traversable 接口的对象中创建可迭代对象,但是实现 Traversable 接口的实习生类无论如何都是可访问的,并且脚本无法实现 Traversable...

(文档中没有提到,SimpleXMLElement 正在实现 Traversable)

于 2010-06-06T01:48:44.223 回答
2

基于,我认为它允许您迭代迭代对象。即,您可以在主对象中提取其他对象并在主对象上使用 IteratorIterator,也可以迭代子对象。

更新:根据您的更新。这对我来说是有意义的,虽然只有一个根对象,所以在这个例子中迭代它并不真正适用,但是如果有更多的根对象,你可以。换句话说,我相信 IteratorIterator 与嵌套的 foreach 循环相同,而不必知道每个对象的所有元素。换句话说,使用面向对象对象的嵌套 foreach ......有一个多余的语句。:-)

于 2009-09-02T13:30:03.820 回答
0

我认为这里的示例#2非常简单......
它基本上让您为您的类实现下一个/上一个/当前/倒带/键数组函数的特定行为,这是 php foreach 解析器所期望的。

因此,为了实现您的问题,可以创建一个以 PDOStatement 作为其成员的 Iterator 类,而不是例如使用 next 方法调用 PDOStatement::fetch 以返回其下一条语句。存储它可以让你同时实现旧的和当前的。没有过多地使用这个类,但我敢打赌,实现倒带和键并不难。请注意,这是即时的,所以我可能在细节上错了,但我认为这个概念应该很清楚

于 2009-09-02T12:13:45.487 回答