我应该在PHP中使用哪种Iterator实现,为什么?

时间:2008-12-11 11:55:26

标签: php design-patterns iterator spl

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

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
}   

甚至允许

StandardPHPLibrary (SPL)迭代器
foreach($iterator as $item) {
    // do something with $item
}   

有这么多不同的迭代器(使用不同的方法来循环集合)似乎是一种强烈的代码味道,我倾向于将所有内容重构为SPL。 这些迭代器的实现是否具有令人信服的优势,还是仅仅是个人品味的问题?

2 个答案:

答案 0 :(得分:9)

SPL版本绝对是最佳选择。它不仅是最容易阅读的,而且它现在是PHP的一部分,所以对更多人来说会很熟悉。

其他人没有“错误”,但正如你所说,在一个项目中拥有所有这些不同的版本并没有帮助任何人。

答案 1 :(得分:1)

Imo,简单地使用一个或多个SPL库作为界面,在前端使用时往往不那么难看。但是,实施背后的支持可能会有点难看。

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

精彩地工作,你只是祈祷那些让幕后魔术永远失败的代码永远不会失败,因为当他们看到你使用的东西看起来像一个数组时会让人感到困惑,而且它会“魔法”失败:)

魔术让人们在火刑柱上被焚烧。因此,仔细而明智地使用它,可能会使其显而易见。

我个人的偏好是

for( $object as $i => $v ) 

它的表示法通常更加一致和可预测。

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

}

样式符号在功能上是相同的,但至少你猜测它在表面上是如何工作的。