PHP - 使用迭代器的原因?

mrj*_*ner 23 php iterator

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

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

mar*_*rio 18

我认为主要原因是多功能性.它们不会使事情更具可读性,你可以用简单的方法完成spl迭代器的大部分工作foreach.

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

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

但最终它真的是一种风格选择.如果你有自定义对象遍历某些东西(例如可以指向真实文件或数据库条目的VFS对象),那将是最有意义的.但即使这样你也可以iterator_to_array转换这样的列表,并使用普通的foreach-over-array.

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


igo*_*orw 16

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

  • 怠惰
  • 减少内存使用量
  • 组成

怠惰

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

减少内存使用量

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

组成

什么马里奥说.


JuozasKaziukėnas最近写了一篇关于如何使用迭代器模拟PHP中的延迟评估的博客文章.它详细介绍了我提到过的一些事情.


Tad*_*eck 10

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

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

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


dec*_*eze 7

一个简单的例子:实现一个可以像数组一样访问和遍历的对象.SimpleXML是一个很好的例子,可以通过它实现强大的行为.

要做到这一点你可以implementIterator接口定义的方法public current(),public key(),public next(),public rewind()public valid().

或者您可以简单地implement使用另一个IteratorAggregate接口来定义一个方法public getIterator(),该方法只返回您想要公开的内部数据的Iterator.

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