我今天正在阅读手册并注意到各种迭代器.对我来说,似乎他们都毫无意义; 除非您更喜欢它们的语法,或者不知道如何编写递归函数,否则我没有理由使用它们.是否有任何理由在PHP中使用内置迭代器而不仅仅是编写循环或制作递归方法?
我只是在寻找事实反应,而不是主观偏好(即:我不在乎你是否认为它更"可读"或"更面向对象",我想知道它们是否更快,提供的功能可以滚动自己的时候就不会实现,等等.
mar*_*rio 18
我认为主要原因是多功能性.它们不会使事情更具可读性,你可以用简单的方法完成spl迭代器的大部分工作foreach
.
但是迭代器可以作为一种可以传递的压缩循环或循环源.您可以拥有比列表/数组更多样化的数据源.而真正的优势在于您可以将它们包装或堆叠以进行聚合.
命名有点不明显,但我想你可以使用AppendIterator
to来组合一个静态文件名列表和一个结果DirectoryIterator
.或者将其包裹在一个LimitIterator
而不是硬连接到for
条件中.所有这些都是非常基本的功能,可以在foreach中手动完成.但至少RegexIterator
并且FilterIterator
似乎适合降低一些复杂性.
但最终它真的是一种风格选择.如果你有自定义对象遍历某些东西(例如可以指向真实文件或数据库条目的VFS对象),那将是最有意义的.但即使这样你也可以iterator_to_array
转换这样的列表,并使用普通的foreach
-over-array.
唯一的情况是,如果数据源的大小不受限制,那么首选迭代器是非常必要的.用于a的展开数组foreach
比可以逐元素检索的迭代器消耗更多内存.
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)
一个简单的例子:实现一个可以像数组一样访问和遍历的对象.SimpleXML是一个很好的例子,可以通过它实现强大的行为.
要做到这一点你可以implement
在Iterator
接口定义的方法public current()
,public key()
,public next()
,public rewind()
和public valid()
.
或者您可以简单地implement
使用另一个IteratorAggregate
接口来定义一个方法public getIterator()
,该方法只返回您想要公开的内部数据的Iterator.
请务必查看上述接口的示例,您将看到其优势.