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中GET变量的使用
Oct 09 PHP
让你的PHP同时支持GIF、png、JPEG
Oct 09 PHP
php实现的MySQL通用查询程序
Mar 11 PHP
PHP面向对象——访问修饰符介绍
Nov 08 PHP
自定义session存储机制避免会话保持问题
Oct 08 PHP
CI框架入门示例之数据库取数据完整实现方法
Nov 05 PHP
ThinkPHP中数据操作案例分析
Sep 27 PHP
php日期操作技巧小结
Jun 25 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
Sep 19 PHP
php版微信公众号自定义分享内容实现方法
Sep 22 PHP
php实现批量上传数据到数据库(.csv格式)的案例
Jun 18 PHP
PHP面向对象之领域模型+数据映射器实例(分析)
Jun 21 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面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
DedeCMS 核心类TypeLink.class.php摘要笔记
2010/04/07 PHP
学习php笔记 字符串处理
2010/10/19 PHP
centos 5.6 升级php到5.3的方法
2011/05/14 PHP
PHP小教程之实现双向链表
2014/06/12 PHP
PHP+Ajax 检测网络是否正常实例详解
2016/12/16 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
PHP有序表查找之二分查找(折半查找)算法示例
2018/02/09 PHP
PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
2018/06/22 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
How to Auto Include a Javascript File
2007/02/02 Javascript
js控制的回到页面顶端goTop的代码实现
2013/03/20 Javascript
jQuery之选择组件的深入解析
2013/06/19 Javascript
Angular2 父子组件数据通信实例
2017/06/22 Javascript
webpack实现热加载自动刷新的方法
2017/07/30 Javascript
详解VueRouter进阶之导航钩子和路由元信息
2017/09/13 Javascript
基于复选框demo(分享)
2017/09/27 Javascript
vuex进阶知识点巩固
2018/05/20 Javascript
vue中子组件调用兄弟组件方法
2018/07/06 Javascript
详解vue-property-decorator使用手册
2019/07/29 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
js实现3D粒子酷炫动态旋转特效
2020/09/13 Javascript
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
python绘制圆柱体的方法
2018/07/02 Python
一篇文章弄懂Python中所有数组数据类型
2019/06/23 Python
Django CBV类的用法详解
2019/07/26 Python
Python爬取爱奇艺电影信息代码实例
2019/11/26 Python
戴森香港官方网站:Dyson香港
2021/02/11 全球购物
出国导师推荐信
2014/01/16 职场文书
触摸春天教学反思
2014/02/03 职场文书
文明礼仪标语
2014/06/13 职场文书
债务纠纷委托书
2014/08/30 职场文书
论文答谢词
2015/01/20 职场文书
2015年国庆晚会主持词
2015/07/01 职场文书
描述鲁迅的名言整理,一生受用
2019/08/08 职场文书
JS如何使用剪贴板操作Clipboard API
2021/05/17 Javascript