【问题标题】:Which implementation of Iterator should I use in PHP, and why?我应该在 PHP 中使用哪个 Iterator 实现,为什么?
【发布时间】:2010-09-26 10:10:13
【问题描述】:

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

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。 Iterator 的这些实现是否有令人信服的优势,还是纯粹是个人喜好问题?

【问题讨论】:

    标签: php design-patterns iterator spl


    【解决方案1】:

    SPL 版本绝对是要走的路。它不仅是最容易阅读的,而且现在是 PHP 的一部分,所以会被更多人所熟悉。

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

    【讨论】:

      【解决方案2】:

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

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

      工作得非常好,你只需要祈祷那些在幕后创造魔法的代码永远不会失败,因为当人们看到你使用看起来像数组的东西时,它会让人们感到困惑,而且它确实有可能失败的“魔法”:)

      魔法让人们在火刑柱上被烧死。因此,谨慎而明智地使用它,可能让它的工作原理一目了然。

      我的个人偏好是

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

      它的符号通常更加一致和可预测。

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

      样式符号在功能上是相同的,但至少你对它表面上的工作原理有了更少的猜测。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-09
        • 2021-12-11
        • 2011-05-16
        • 2011-06-22
        • 1970-01-01
        • 2010-11-21
        • 2011-10-11
        • 2011-01-29
        相关资源
        最近更新 更多