PHP Iterator(迭代器)接口

iterator

【百度词条迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。 从定义可见,迭代器模式是为容器而生。很明显,对容器对象的访问必然涉及到遍历算法。你可以一股脑的将遍历方法塞到容器对象中去;或者根本不去提供什么遍历算法,让使用容器的人自己去实现去吧。这两种情况好像都能够解决问题。在各编程语言的实现中:遍历器是一种接口,为各种不同的数据结构提供统一访问机制。

迭代器其实就是一种具有迭代属性和方法的数据对象。

 

Iterator(迭代器)接口【PHP官方文档】

可在内部迭代自己的外部(这里所谓的外部是指运行时迭代器使用了外部创建的迭代属性和方法的类或接口)迭代器或类的接口。

<?php
    class myIterator implements Iterator 
    {
        private $position = 0;
        private $array = array(
            "firstelement",
            "secondelement",
            "lastelement",
        );  

        public function __construct() 
        {
            $this->position = 0;
        }

        function rewind() 
        {
            var_dump(__METHOD__);
            $this->position = 0;
        }

        function current() 
        {
            var_dump(__METHOD__);
            return $this->array[$this->position];
        }

        function key() 
        {
            var_dump(__METHOD__);
            return $this->position;
        }

        function next() 
        {
            var_dump(__METHOD__);
            ++$this->position;
        }

        function valid() 
        {
            var_dump(__METHOD__);
            return isset($this->array[$this->position]);
        }
    }

    $it = new myIterator;

    foreach($it as $key => $value) 
    {
        var_dump($key, $value);
        echo "\n";
    }
?>

 

接口摘要

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

Traversable:

检测一个类是否可以使用 foreach 进行遍历的接口。

无法被单独实现的基本抽象接口。相反它必须由 IteratorAggregateIterator 接口实现。

Note:

实现此接口的内建类可以使用 foreach 进行遍历而无需实现 IteratorAggregateIterator 接口。

Note:

这是一个无法在 PHP 脚本中实现的内部引擎接口。IteratorAggregateIterator 接口可以用来代替它。

这个接口没有任何方法,它的作用仅仅是作为所有可遍历类的基本接口。

 

预定义迭代器

PHP 已经提供了一些用于日常任务的迭代器。 详细列表参见 SPL 迭代器

 

IteratorAggregate(聚合式迭代器)接口

创建外部(这里所谓的外部是指运行时迭代器使用了外部创建的迭代属性和方法的类或接口)迭代器的接口。

<?php
    class myData implements IteratorAggregate
    {
        public $property1 = "Public property one";
        public $property2 = "Public property two";
        public $property3 = "Public property three";

        public function __construct() 
        {
            $this->property4 = "last property";
        }

        public function getIterator() 
        {
            return new ArrayIterator($this);
        }
    }

    $obj = new myData;

    foreach($obj as $key => $value) 
    {
        var_dump($key, $value);
        echo "\n";
    }
?>

 

总结:需要理解的概念都很清晰简单,在概念里唯一出现的“外部迭代-内部迭代”。其实无论是内部还是外部指的都是具有迭代属性的数据和方法对象。内部迭代不过是继承迭代基础接口,继承覆盖父类方法自定义操作。而外部迭代器(聚合式迭代器)是指通过对象类的外部获得的迭代器,对象本身不具有迭代器的基类属性和方法。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开软古剑楠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值