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入门的学习方法
Jan 02 PHP
php smarty模版引擎中的缓存应用
Dec 02 PHP
mysql_num_rows VS COUNT 效率问题分析
Apr 23 PHP
PHP 输出URL的快捷方式示例代码
Sep 22 PHP
一个简单且很好用的php分页类
Oct 26 PHP
PHP eval函数使用介绍
Dec 08 PHP
thinkPHP学习笔记之安装配置篇
Mar 05 PHP
PHP中的常见魔术方法功能作用及用法实例
Jul 01 PHP
php模拟post上传图片实现代码
Jun 24 PHP
PHP数组生成XML格式数据的封装类实例
Nov 10 PHP
在Laravel中使用DataTables插件的方法
May 29 PHP
php redis setnx分布式锁简单原理解析
Oct 23 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来自动调用不同服务器上的flash
2006/10/09 PHP
php分页原理 分页代码 分页类制作教程
2016/09/23 PHP
CentOS7编译安装php7.1的教程详解
2019/04/18 PHP
Laravel框架源码解析之反射的使用详解
2020/05/14 PHP
Javascript操纵Cookie实现购物车程序
2006/11/23 Javascript
jquery UI 1.72 之datepicker
2009/12/29 Javascript
JS的反射问题
2010/04/07 Javascript
xheditor与validate插件冲突的解决方案
2010/04/15 Javascript
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
一个简单的Node.js异步操作管理器分享
2014/04/29 Javascript
jquery操作checkbox示例分享
2014/07/21 Javascript
js超时调用setTimeout和间歇调用setInterval实例分析
2015/01/28 Javascript
jQuery实现鼠标滑过Div层背景变颜色的方法
2015/02/17 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
2015/12/22 Javascript
Web前端开发工具——bower依赖包管理工具
2016/03/29 Javascript
JS 日期与时间戮相互转化的简单实例
2016/06/22 Javascript
深入理解jQuery layui分页控件的使用
2016/08/17 Javascript
js 原型对象和原型链理解
2017/02/09 Javascript
JavaScript之Date_动力节点Java学院整理
2017/06/28 Javascript
js获取html页面代码中图片地址的实现代码
2018/03/05 Javascript
Vuex实现简单购物车
2021/01/10 Vue.js
在Python中使用异步Socket编程性能测试
2014/06/25 Python
在Python的Django框架中实现Hacker News的一些功能
2015/04/17 Python
关于Python的一些学习总结
2018/05/25 Python
python变量赋值方法(可变与不可变)
2019/01/12 Python
tensorflow 实现打印pb模型的所有节点
2020/01/23 Python
python实现简单的购物程序代码实例
2020/03/03 Python
python中openpyxl和xlsxwriter对Excel的操作方法
2021/03/01 Python
美国在线印刷公司:PsPrint
2017/10/12 全球购物
预备党员公开承诺书
2014/05/28 职场文书
2015年毕业生实习评语
2015/03/25 职场文书
与死神共舞观后感
2015/06/15 职场文书
爱国主义教育主题班会
2015/08/13 职场文书
《黄道婆》教学反思
2016/02/22 职场文书
关于k8s环境部署mysql主从的问题
2022/03/13 MySQL