乐趣区

关于后端:PHP-的迭代器Iterator

前沿

上回咱们探讨了 PHP 的生成器,明天咱们来看看 PHP 的迭代器。

区别

生成器和迭代器有什么区别呢?

一句话:生成器只是简略的迭代器。

与规范的 PHP 迭代器不同,PHP 生成器不要求类实现 Iterator 接口,从而加重了类的累赘。生成器会依据需要计算并产出要迭代的值。这对利用的性能有重大影响。试想一下,如果规范的 PHP 迭代器常常在内存中执行迭代操作,这要事后计算出数据集,性能低下;如果要应用特定的形式计算大量数据,对性能的影响更甚。此时咱们能够应用生成器,即便计算并产出后续值,不占用贵重的内存资源。

作用

迭代器有什么作用呢?

让对象变得可迭代并体现得像对象汇合。

咱们来看一道 腾讯面试题

使对象能够像数组一样进行 foreach 循环,要求属性必须是公有。

这题其实就是考查到了迭代器了

咱们先看看迭代器的接口

Iterator extends Traversable {
/* 办法 */
  abstract public current ( ) : mixed
  abstract public key ( ) : scalar
  abstract public next ( ) : void
  abstract public rewind ( ) : void
  abstract public valid () : bool}

外面定义了 5 个形象办法

来看看最初的答案

class sample implements Iterator
{private $_items = array(1,2,3,4,5,6,7);
    public function __construct() {}
    // 重置到到第一个元素
    public function rewind() { reset($this->_items); }
    // 返回以后元素
    public function current() { return current($this->_items); }
    // 返回以后元素到键 
    public function key() { return key($this->_items); }
    // 返回下一个元素
    public function next() { return next($this->_items); }
    // 查看以后元素是否无效
    public function valid() { return ( $this->current() !== false ); }
}
$sa = new sample();
foreach($sa as $key => $val){print $key . "=>" . $val;}
// 输入 0 =>1 1=>2 2=>3 3=>4 4=>5 5=>6 6=>7

咱们通过 foreach 遍历对象的时候,外部会顺次调用

  • rewind() 重置到第一个元素
  • valid() 查看以后地位是否无效
  • current() 返回以后元素
  • key() 返回以后元素的键
  • next() 指向下一个元素

致谢

感激你看完这篇文章,有什么不对的中央欢送指出,谢谢????

退出移动版