尽我所能,我无法理解 IteratorIterator 类的实际用途。我知道类可以实现 Traversable,因此引擎知道它可以使用 foreach 循环 我意识到 IteratorIterator 应该将任何可遍历的东西转换为迭代器,但我一生都无法理解如何转换。

举个例子, PDO声明 班级;如何实现标准迭代器方法(next、key、rewind 等)以允许对 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 作为参数以及它如何设法迭代子元素。

有帮助吗?

解决方案

根据

这个,我觉得它可以让你迭代在迭代的对象。即你可以把其他对象在主对象和你的主对象上使用IteratorIterator,迭代子对象也是如此。

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

其他提示

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


迭代器迭代器 >

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

可穿越 >

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

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

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

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

我想例如#2 这里是相当简单...点击 它基本上可以让你实现你的类下一/上/电流/快退/按键阵列功能,在PHP的foreach解析器预期特定的行为。

所以对于实现你的问题,一会创建一个迭代器类的PDOStatement对象为memeber,比例如使用下一个方法调用PDOStatement对象::获取返回其下一个语句。存储它会让你同时实现perivous和电流。没有带使用这个类太多,但我敢打赌,这并不难o实施倒带和关键。注意,这是在飞行,所以我可能是错的细节,但我认为这个概念应该是清楚的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top