我应该在PHP中使用哪个迭代器实现,为什么?

我应该在PHP中使用哪个迭代器实现,为什么?,php,design-patterns,iterator,spl,Php,Design Patterns,Iterator,Spl,我正在尝试重构一个大型的旧项目,我注意到一件事是一系列不同的迭代器实现: while($iterator->moveNext()) { $item = $iterator->current(); // do something with $item; } for($iterator = getIterator(), $iterator->HasNext()) { $item = $iterator->Next(); // do so

我正在尝试重构一个大型的旧项目,我注意到一件事是一系列不同的迭代器实现:

while($iterator->moveNext()) {
    $item = $iterator->current();
    // do something with $item;
}   

for($iterator = getIterator(), $iterator->HasNext()) {
    $item = $iterator->Next();
    // do something with $item
}   

while($item = $iterator->fetch()) {
    // do something with item
}   
甚至是允许

foreach($iterator as $item) {
    // do something with $item
}   
拥有这么多不同的迭代器(使用不同的方法在集合上循环)似乎是一种强烈的代码味道,我倾向于将所有东西重构为SPL。
迭代器的这些实现有没有令人信服的优势,或者这纯粹是个人喜好的问题

SPL版本绝对是一个不错的选择。它不仅是最容易阅读的,而且现在已经是PHP的一部分,因此会为更多的人所熟悉


其他的没有什么“错误”,但正如您所说的,在一个项目中使用所有这些不同的版本对任何人都没有帮助。

Imo,简单地使用一个或多个SPL库作为界面,在前端使用起来就不那么难看了。然而,实现背后的支持可能会变得有点丑陋

例如,我编写了一个迭代器,该迭代器有效地迭代了数据库结果集,因此从未请求过的结果永远不会从请求指针中获取,如果过早地获取了项(即:$obj[5]),它会将所有需要的结果查找到内部缓冲区中

工作非常出色,你只需祈祷幕后的魔法代码永远不会失败,因为当人们看到你使用类似数组的东西时,它会让人困惑,而且它会产生“魔法”,可能会失败:)

魔法把人们烧死在火刑柱上。因此,谨慎而明智地使用它,尽可能使它的工作原理显而易见

我个人的偏好是

for( $object as $i => $v ) 
它的符号通常更加一致和可预测

for( $dbresult->iterator() as $i => $v ){ 

}
样式表示法在功能上是相同的,但至少您对它在表面上的工作方式没有太多猜测