PHP - 使用迭代器的原因?

时间:2011-06-06 01:24:30

标签: php iterator

我今天正在阅读手册并注意到various iterators。对我来说,似乎他们都毫无意义;除非您更喜欢它们的语法,或者不知道如何编写递归函数,否则我没有理由使用它们。有没有理由在PHP中使用内置迭代器而不仅仅是编写循环或者使用递归方法?

我只是在寻找事实反应,而不是主观偏好(即:我不在乎你是否认为它更“可读”或“更面向对象”,我想知道它们是否更快,提供滚动自己等时无法实现的功能。)。

5 个答案:

答案 0 :(得分:18)

我认为主要原因是多功能性。它们不会使事情更具可读性,您可以完成spl iterators对简单foreach所做的大部分工作。

但是迭代器可以作为一种可以传递的压缩循环或循环源。您可以拥有比列表/数组更多样化的数据源。而真正的优势在于您可以将它们包装或堆叠以进行聚合。

命名有点不明显,但我想你可以使用AppendIterator来组合静态文件名列表和DirectoryIterator的结果。或以其他方式将其包裹在LimitIterator中,而不是硬连线到for条件。所有这些都是非常基本的功能,可以在foreach中手动完成。但至少RegexIteratorFilterIterator似乎适合降低一些复杂性。

但最终它确实是一种风格选择。如果你有自定义对象遍历某些东西(例如可以指向真实文件或数据库条目的VFS对象),那将是最有意义的。但即便如此,您也可以iterator_to_array转换此类列表,并使用正常的foreach - 过度数组。

唯一的情况是,如果数据源的大小不受限制,那么首选迭代器是非常必要的。用于foreach的展开数组可以比迭代器消耗更多内存,迭代器可以逐元素检索。

答案 1 :(得分:16)

迭代器的主要优点是它们抽象了迭代的概念。这意味着可以通过相同的接口使用任何数据提供者。而这正是你可以利用它们的地方:

  • 懒惰
  • 减少内存使用量
  • 组合物

<强>懒惰

对于数据提供者,只有在您真正需要时才会获取数据(例如,在您进行迭代时)。

减少内存使用量

迭代器鼓励您迭代处理数据,而不是在内存中缓冲它。虽然可以在没有迭代器的情况下执行此操作,但它们提供的抽象隐藏了实现,这使得它们非常易于使用。

<强>组合物

马里奥说的话。


JuozasKaziukėnas最近写了blog post如何使用迭代器来模拟PHP中的延迟评估。它详细介绍了我提到过的一些事情。

答案 2 :(得分:10)

这个问题可以有很多种答案,但正确的答案可能概括为:迭代器可用于迭代任何比简单数组更复杂的东西

一个例子是某种ORM或查询构建器。假设我们有一个 - 使用它可能看起来像这样:

$friends = new Model_Friend();
$friends = $people->where('age','>',30)->where('gender','=','female');
foreach ($friends as $friend) {
    echo $friend->name;
}

答案 3 :(得分:7)

一个简单的例子:实现一个可以像数组一样访问和遍历的对象。 SimpleXML是用这个可以实现的强大行为的一个很好的例子。

要完成此操作,您可以implement Iterator interface定义方法public current()public key()public next()public rewind()和{{1} }}

或者您只需public valid()替代IteratorAggregate interface定义一个方法implement,它只返回您想要公开的内部数据的迭代器。

请务必查看上述接口的示例,您将看到其优势。

答案 4 :(得分:1)

迭代器和其他任何东西一样快,但是有一个更简单的界面,也许更多的verbage来包装它。但是,主要优点不是你现在可能需要的,但你如何扩展它们来处理你的未来的问题(他们会来!),这就是我们的老男孩所说的&#34;拯救你未来的屁股&#34;。 :)