PHP迭代器的内部执行过程详解


Posted in PHP onNovember 12, 2013
class myIterator implements Iterator {
    private $position = 0;
    private $array = array(
        "first_element",
        "second_element",
        "last_element",
    );  
    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) {
 echo '输出键值:';
    var_dump($key, $value);
 //echo $key;
    echo "\n";
}

程序运行输出:
string(18) "myIterator::rewind"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
输出键值:int(0)
string(13) "first_element"
string(16) "myIterator::next"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
输出键值:int(1)
string(14) "second_element"
string(16) "myIterator::next"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
输出键值:int(2)
string(12) "last_element"
string(16) "myIterator::next"
string(17) "myIterator::valid"

一般的迭代器内部需要下面的方法:
Iterator::current — Return the current element 返回当前元素
Iterator::key — Return the key of the current element 返回当前元素的键
Iterator::next — Move forward to next element 移向下一个元素
Iterator::rewind — Rewind the Iterator to the first element 重新回到第一个元素
Iterator::valid — Checks if current position is valid 检查当前位置的有效性
如果不是很清楚迭代器的内容工作流程,可以查看下面的迭代器对数组的遍历过程:
/**
* @author 简明现代魔法 http://www.nowamagic.net
*/
class MyIterator implements Iterator
{
     private $var = array();
     public function __construct($array)
     {
         if (is_array($array)) {
            $this->var = $array;
         }
     }
     public function rewind() {
         echo "倒回第一个元素\n";
        reset($this->var);
     }
     public function current() {
        $var = current($this->var);
         echo "当前元素: $var\n";
         return $var;
     }
     public function key() {
        $var = key($this->var);
         echo "当前元素的键: $var\n";
         return $var;
     }
     public function next() {
        $var = next($this->var);
         echo "移向下一个元素: $var\n";
         return $var;
     }
     public function valid() {
        $var = $this->current() !== false;
         echo "检查有效性: {$var}\n";
         return $var;
     }
}
$values = array(1,2,3);
$it = new MyIterator($values);
foreach ($it as $k => $v) {
     print "此时键值对 -- key $k: value $v\n\n";
}

程序运行结果:
倒回第一个元素
当前元素: 1
检查有效性: 1
当前元素: 1
当前元素的键: 0
此时键值对 -- key 0: value 1
移向下一个元素: 2
当前元素: 2
检查有效性: 1
当前元素: 2
当前元素的键: 1
此时键值对 -- key 1: value 2
移向下一个元素: 3
当前元素: 3
检查有效性: 1
当前元素: 3
当前元素的键: 2
此时键值对 -- key 2: value 3
移向下一个元素: 
当前元素: 
检查有效性:

现在就很清晰了吧?
PHP 相关文章推荐
PHP文本操作类
Nov 25 PHP
PHP IPV6正则表达式验证代码
Feb 16 PHP
献给php初学者(入门学习经验谈)
Oct 12 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
May 02 PHP
PHP与SQL注入攻击防范小技巧
Sep 16 PHP
zf框架的Filter过滤器使用示例
Mar 13 PHP
php实现数组筛选奇数和偶数示例
Apr 11 PHP
PHP生成数组再传给js的方法
Aug 07 PHP
帝国cms常用标签汇总
Jul 06 PHP
yii2分页之实现跳转到具体某页的实例代码
Jun 02 PHP
php微信开发之关注事件
Jun 14 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
May 14 PHP
PHP迭代器实现斐波纳契数列的函数
Nov 12 #PHP
PHP SPL使用方法和他的威力
Nov 12 #PHP
PHP使用SOAP调用.net的WebService数据
Nov 12 #PHP
php获取远程图片体积大小的实例
Nov 12 #PHP
php过滤XSS攻击的函数
Nov 12 #PHP
php获取新浪微博数据API实例
Nov 12 #PHP
php生成N个不重复的随机数实例
Nov 12 #PHP
You might like
PHP详细彻底学习Smarty
2008/03/27 PHP
PHP在字符断点处截断文字的实现代码
2011/04/21 PHP
PHP 字符串长度判断效率更高的方法
2014/03/02 PHP
php有效防止同一用户多次登录
2015/11/19 PHP
该如何加载google-analytics(或其他第三方)的JS
2010/05/13 Javascript
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
2011/04/24 Javascript
Javascript Request获取请求参数如何实现
2012/11/28 Javascript
用js实现in_array的方法
2013/11/05 Javascript
JavaScript设计模式之外观模式实例
2014/10/10 Javascript
javascript浏览器窗口之间传递数据的方法
2015/01/20 Javascript
JSON遍历方式实例总结
2015/12/07 Javascript
老生常谈原生JS执行环境与作用域
2016/11/22 Javascript
js遮罩效果制作弹出注册界面效果
2017/01/25 Javascript
js的继承方法小结(prototype、call、apply)(推荐)
2019/04/17 Javascript
微信小程序实现分页加载效果
2020/11/19 Javascript
Python enumerate遍历数组示例应用
2008/09/06 Python
使用Python进行稳定可靠的文件操作详解
2013/12/31 Python
Django小白教程之Django用户注册与登录
2016/04/22 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
2018/02/22 Python
python与mysql数据库交互的实现
2020/01/06 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
2020/12/18 Python
canvas学习和滤镜实现代码
2018/08/22 HTML / CSS
世界上最大的街头服饰网站:Karmaloop
2017/02/04 全球购物
2019史上最全Database工程师题库
2015/12/06 面试题
学校办公室主任职责
2013/12/27 职场文书
领导失职检讨书
2014/02/24 职场文书
《生命 生命》教学反思
2014/04/19 职场文书
教师教学评估方案
2014/05/09 职场文书
优秀应届生求职信
2014/06/16 职场文书
社区娱乐活动方案
2014/08/21 职场文书
怎样写离婚协议书
2014/09/10 职场文书
放假通知
2015/04/14 职场文书
2015年度物业公司工作总结
2015/04/27 职场文书
校园运动会广播稿
2015/08/19 职场文书
2016年村党支部公开承诺书
2016/03/24 职场文书
2019新员工试用期转正工作总结范文
2019/08/21 职场文书