关键词搜索

源码搜索 ×
×

PHP迭代器的小坑

发布2017-07-31浏览1222次

详情内容

使用PHP迭代器的时候,需要主要到很多迭代器是对内部迭代器的封装,当外部迭代器移动的时候,实际上也是在移动内部迭代器。

示例一:命令行

&"C:\wamp64\bin\php\php7.1.3\php.exe" -r '$a = new ArrayObject([7,8,9]); $b = $a->getIterator(); $c = new CachingIterator($b, CachingIterator::FULL_CACHE); echo $c->count(); $c->next(); echo $c->count(); echo $c->current(); echo $b->current(); $c->next(); echo $c->count(); echo $c->current(); echo $b->current();'

    示例一:源代码

    $a = new ArrayObject([7,8,9]);
    $b = $a->getIterator();
    $c = new CachingIterator($b, CachingIterator::FULL_CACHE);
    echo $c->count(); //0
    $c->next();
    echo $c->count(); //1
    echo $c->current(); //7
    echo $b->current(); //8
    $c->next();
    echo $c->count(); /https://cdn.jxasp.com:9143/image/2
    echo $c->current(); //8
    echo $b->current(); //9
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    可以看出,虽然类的名字叫Caching,而且设置了FULL_CACHE选项,但是并没有缓存全部数据,而是访问一项,缓存一项,同时也在移动内部迭代器。

    示例二:命令行

    &"C:\wamp64\bin\php\php7.1.3\php.exe" -r '$a = new ArrayObject([7,8,9]); $b = $a->getIterator(); $c = $a->getIterator(); echo $c->count(); $c->next(); echo $c->count(); echo $c->current(); echo $b->current(); $c->next(); echo $c->count(); echo $c->current(); echo $b->current();'

      示例二:源代码

      $a = new ArrayObject([7,8,9]);
      $b = $a->getIterator();
      $c = $a->getIterator();
      echo $c->count(); //3
      $c->next();
      echo $c->count(); //3
      echo $c->current(); //8
      echo $b->current(); //7
      $c->next();
      echo $c->count(); //3
      echo $c->current(); //9
      echo $b->current(); //7
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12

      可以看出此处的两个迭代器互不影响。


      简单的说,如果希望对同一个数据迭代而且互不影响,那么应当先转成数据,然后创建ArrayIterator。程序简单的时候一般不会遇到这个问题,不过当程序复杂的时候,尽量还是避免迭代器之间的干扰。

      相关技术文章

      点击QQ咨询
      开通会员
      返回顶部
      ×
      微信扫码支付
      微信扫码支付
      确定支付下载
      请使用微信描二维码支付
      ×

      提示信息

      ×

      选择支付方式

      • 微信支付
      • 支付宝付款
      确定支付下载