【问题标题】:How does the PHP IteratorIterator class work?PHP IteratorIterator 类是如何工作的?
【发布时间】:2009-09-02 10:33:26
【问题描述】:

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

PDOStatement 类为例;如何实现标准迭代器方法(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 作为参数以及它如何设法遍历子元素。

【问题讨论】:

  • 我找到了答案here。但在我看来,IteratorIterator 现在变得不那么重要了,不是吗?

标签: php iterator spl


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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


    迭代器迭代器>

    • "这个迭代器包装器允许 任何事物的转换 可遍历到迭代器。”

    可遍历 >

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      猜你喜欢
      • 2012-08-02
      • 2013-08-24
      • 2011-05-12
      • 1970-01-01
      • 2010-10-24
      • 2015-01-10
      • 1970-01-01
      • 2010-12-29
      • 2012-08-02
      相关资源
      最近更新 更多