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与paypal整合方法
Nov 28 PHP
解析php安全性问题中的:Null 字符问题
Jun 21 PHP
PHP中spl_autoload_register函数的用法总结
Nov 07 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
Apr 10 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
Jul 14 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
Oct 08 PHP
php实现图片上传并利用ImageMagick生成缩略图
Mar 14 PHP
Linux平台php命令行程序处理管道数据的方法
Nov 10 PHP
php实现当前页面点击下载文件的实例代码
Nov 16 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
Jul 03 PHP
php使用imagecopymerge()函数创建半透明水印
Jan 25 PHP
Laravel如何自定义command命令浅析
Mar 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模拟asp中的XmlHttpRequest实现http请求的代码
2011/03/24 PHP
PHP中::、->、self、$this几种操作符的区别介绍
2013/04/24 PHP
php使用pack处理二进制文件的方法
2014/07/03 PHP
PHP执行shell脚本运行程序不产生core文件的方法
2016/12/28 PHP
php+lottery.js实现九宫格抽奖功能
2019/07/21 PHP
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
基于mootools插件实现遮罩层新手引导
2012/05/24 Javascript
JS+CSS实现的简单折叠展开多级菜单效果
2015/09/12 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
2016/04/20 Javascript
javascript js 操作数组 增删改查的简单实现
2016/06/20 Javascript
JS实现表单验证功能(验证手机号是否存在,验证码倒计时)
2016/10/11 Javascript
js实现3D图片展示效果
2017/03/09 Javascript
使用JavaScript实现一个小程序之99乘法表
2017/09/21 Javascript
Vuejs 2.0 子组件访问/调用父组件的方法(示例代码)
2018/02/08 Javascript
js实现查询商品案例
2020/07/22 Javascript
electron踩坑之dialog中的callback解决
2020/10/06 Javascript
详解vue3中组件的非兼容变更
2021/03/03 Vue.js
利用Python如何生成随机密码
2016/04/20 Python
Java Web开发过程中登陆模块的验证码的实现方式总结
2016/05/25 Python
Python备份目录及目录下的全部内容的实现方法
2016/06/12 Python
python批量添加zabbix Screens的两个脚本分享
2017/01/16 Python
[原创]教女朋友学Python(一)运行环境搭建
2017/11/29 Python
Python测试人员需要掌握的知识
2018/02/08 Python
python中返回矩阵的行列方法
2018/04/04 Python
Python3编码问题 Unicode utf-8 bytes互转方法
2018/10/26 Python
PyQt4编程之让状态栏显示信息的方法
2019/06/18 Python
英国领先的互联网葡萄酒礼品商:Vintage Wine & Port
2019/05/24 全球购物
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
2014/03/16 面试题
高中生学习生活的自我评价
2013/11/27 职场文书
火车的故事教学反思
2014/02/11 职场文书
护理专业自荐书
2014/06/04 职场文书
物业总经理助理岗位职责
2014/06/29 职场文书
环境科学专业求职信
2014/08/04 职场文书
2014年部门工作总结
2014/11/12 职场文书
听课评课活动心得体会
2016/01/15 职场文书
前端与RabbitMQ实时消息推送未读消息小红点实现示例
2022/07/23 Java/Android