PHP - 使用迭代器的原因?
我今天正在仔细阅读手册,并注意到各种迭代器。在我看来,它们似乎都有些毫无意义。我看不出有什么理由使用它们,除非你更喜欢它们的语法,或者不知道如何编写递归函数。有什么理由在PHP中使用内置迭代器而不是编写循环或制作递归方法吗?
我只是在寻找事实性的回应,而不是主观偏好(即:我不在乎你是否认为它更“可读”或“更面向对象”,我想知道它们是否更快,提供在滚动自己的功能时无法实现的功能,等等)。
我今天正在仔细阅读手册,并注意到各种迭代器。在我看来,它们似乎都有些毫无意义。我看不出有什么理由使用它们,除非你更喜欢它们的语法,或者不知道如何编写递归函数。有什么理由在PHP中使用内置迭代器而不是编写循环或制作递归方法吗?
我只是在寻找事实性的回应,而不是主观偏好(即:我不在乎你是否认为它更“可读”或“更面向对象”,我想知道它们是否更快,提供在滚动自己的功能时无法实现的功能,等等)。
迭代器的主要优点是它们抽象了迭代的概念。这意味着任何数据提供程序都可以通过同一接口使用。而这正是您可以利用它们的地方:
懒惰
对于数据提供程序,只有在实际需要时(例如,迭代时)才会获取数据。
减少内存使用量
迭代器鼓励您以迭代方式处理数据,而不是在内存中缓冲数据。虽然可以在没有迭代器的情况下做到这一点,但它们提供的抽象隐藏了实现,这使得它们非常易于使用。
组成
马里奥说。
Juozas Kaziukėnas最近写了一篇博客文章,介绍了他如何使用迭代器来模拟PHP中的惰性计算。它详细介绍了我提到的一些事情。
我认为主要原因是多功能性。它们不会使事情更具可读性,您可以使用简单的.foreach
但是迭代器可以作为一种紧凑的循环或循环源,你可以传递它。您可以拥有比列表/数组更多样化的数据源。真正的优点是,您可以包装或堆叠它们以进行聚合。
命名有点不明显,但我想你可以使用 AppendIterator
来组合文件名的静态列表和 DirectoryIterator
的结果。或者以其他方式将其包装在LimitIterator
中,而不是将其硬连接到一个条件中。所有这些都是非常基本的功能,可以在前言中手动完成。但至少RegexIterator
和FilterIterator
似乎适合降低一些复杂性。for
但最终,这确实是一个风格上的选择。如果您有遍历某些内容的自定义对象(例如,可以指向真实文件或数据库条目的VFS对象),则最有意义。但即便如此,您也可以iterator_to_array
转换这样的列表,并使用普通的 -over-array。foreach
唯一的情况是,如果数据源的大小不受限制,则确实必须首选迭代器。与可以逐个元素检索的迭代器相比,在 a 中使用的展开数组可以消耗更多的内存。foreach