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 22 PHP
php 获取select下拉列表框的值
May 08 PHP
php 提速工具eAccelerator 配置参数详解
May 16 PHP
PHP学习笔记之三 数据库基本操作
Jan 17 PHP
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
Jan 31 PHP
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
Jun 12 PHP
php实现utf-8转unicode函数分享
Jan 06 PHP
PHP判断一个字符串是否是回文字符串的方法
Mar 23 PHP
整理php防注入和XSS攻击通用过滤
Sep 13 PHP
PHP+ajax分页实例简析
Dec 07 PHP
laravel自定义分页效果
Jul 23 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
Feb 20 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
一道求$b相对于$a的相对路径的php代码
2010/08/08 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
2015/04/15 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
2016/10/08 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
PHP FileSystem 文件系统常用api整理总结
2019/07/12 PHP
使用TextRange获取输入框中光标的位置的代码
2007/03/08 Javascript
Extjs4 GridPanel的主要配置参数详细介绍
2013/04/18 Javascript
jQuery根据纬度经度查看地图处理程序
2013/05/08 Javascript
jQuery实现Flash效果上下翻动的中英文导航菜单代码
2015/09/22 Javascript
浅析JavaScript声明变量
2015/12/21 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
AngularJS基于provider实现全局变量的读取和赋值方法
2017/06/28 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
vue综合组件间的通信详解
2017/11/06 Javascript
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
vxe-table vue table 表格组件功能
2019/05/26 Javascript
Python实现扫描局域网活动ip(扫描在线电脑)
2015/04/28 Python
浅谈python爬虫使用Selenium模拟浏览器行为
2018/02/23 Python
使用Django启动命令行及执行脚本的方法
2018/05/29 Python
Django 中间键和上下文处理器的使用
2019/03/17 Python
详解Python中的内建函数,可迭代对象,迭代器
2019/04/29 Python
Django 开发环境与生产环境的区分详解
2019/07/26 Python
python实现一次性封装多条sql语句(begin end)
2020/06/06 Python
营业员演讲稿
2013/12/30 职场文书
物流专业求职计划书
2014/01/10 职场文书
银行介绍信范文
2014/01/10 职场文书
活动邀请函范文
2014/01/19 职场文书
模具专业毕业推荐信
2014/03/08 职场文书
五水共治一句话承诺
2014/05/30 职场文书
微笑服务标语
2014/06/24 职场文书
小学感恩教育活动总结
2014/07/07 职场文书
教师节表彰会主持词
2015/07/06 职场文书
2019年入党思想汇报格式与要求
2019/06/25 职场文书
python3操作redis实现List列表实例
2021/08/04 Python
「魔法少女伊莉雅」美游粘土人开订
2022/03/21 日漫
php解析非标准json、非规范json的方式实例
2022/05/10 PHP