我今天正在阅读手册并注意到various iterators。对我来说,似乎他们都毫无意义;除非您更喜欢它们的语法,或者不知道如何编写递归函数,否则我没有理由使用它们。有没有理由在PHP中使用内置迭代器而不仅仅是编写循环或者使用递归方法?
我只是在寻找事实反应,而不是主观偏好(即:我不在乎你是否认为它更“可读”或“更面向对象”,我想知道它们是否更快,提供滚动自己等时无法实现的功能。)。
答案 0 :(得分:18)
我认为主要原因是多功能性。它们不会使事情更具可读性,您可以完成spl iterators对简单foreach
所做的大部分工作。
但是迭代器可以作为一种可以传递的压缩循环或循环源。您可以拥有比列表/数组更多样化的数据源。而真正的优势在于您可以将它们包装或堆叠以进行聚合。
命名有点不明显,但我想你可以使用AppendIterator
来组合静态文件名列表和DirectoryIterator
的结果。或以其他方式将其包裹在LimitIterator
中,而不是硬连线到for
条件。所有这些都是非常基本的功能,可以在foreach中手动完成。但至少RegexIterator
和FilterIterator
似乎适合降低一些复杂性。
但最终它确实是一种风格选择。如果你有自定义对象遍历某些东西(例如可以指向真实文件或数据库条目的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;。 :)