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 相关文章推荐
php4与php5的区别小结(配置异同)
Dec 20 PHP
php DOS攻击实现代码(附如何防范)
May 29 PHP
PHP语法自动检查的Vim插件
Aug 11 PHP
php递归删除目录与文件的方法
Jan 30 PHP
jquery获取多个checkbox的值异步提交给php的方法
Jun 24 PHP
PHP获取文件扩展名的方法实例总结
Jun 10 PHP
php smtp实现发送邮件功能
Jun 22 PHP
PHP简单装饰器模式实现与用法示例
Jun 22 PHP
thinkphp5 migrate数据库迁移工具
Feb 20 PHP
thinkPHP框架RBAC实现原理分析
Feb 01 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
Jul 03 PHP
php+lottery.js实现九宫格抽奖功能
Jul 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写的带缓存数据功能的mysqli类
2012/09/06 PHP
非常好用的Zend Framework分页类
2014/06/25 PHP
使用URL传输SESSION信息
2015/07/14 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
2016/06/28 PHP
javascript编程起步(第四课)
2007/01/10 Javascript
jQuery效果 slideToggle() 方法(在隐藏和显示之间切换)
2011/06/28 Javascript
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
2013/02/05 Javascript
jQuery点击弹出下拉菜单的小例子
2013/08/01 Javascript
javascript学习笔记(七)Ajax和Http状态码
2014/10/08 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
JS+CSS实现滑动切换tab菜单效果
2015/08/25 Javascript
vue.js入门(3)——详解组件通信
2016/12/02 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
fullpage.js最后一屏滚动方式
2018/02/06 Javascript
jQuery模拟12306城市选择框功能简单实现方法示例
2018/08/13 jQuery
react 应用多入口配置及实践总结
2018/10/17 Javascript
vue 关闭浏览器窗口的时候,清空localStorage的数据示例
2019/11/06 Javascript
python基础教程之常用运算符
2014/08/29 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
2019/06/05 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
2019/06/21 Python
PyCharm第一次安装及使用教程
2020/01/08 Python
python使用python-pptx删除ppt某页实例
2020/02/14 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
Html5之svg可缩放矢量图形_动力节点Java学院整理
2017/07/17 HTML / CSS
html5中valid、invalid、required的定义
2014/02/21 HTML / CSS
鼠标滚轮事件和Mac触控板双指事件
2019/12/23 HTML / CSS
德国古洛迷亚百货官网:GALERIA Kaufhof
2017/06/20 全球购物
100%植物性、有机、即食餐:Sakara Life
2018/10/25 全球购物
德国专业木制品经销商:Holz-Direkt24
2019/12/26 全球购物
计算机本科生自荐信
2013/10/15 职场文书
专业求职信撰写要诀
2014/02/18 职场文书
企业出纳岗位职责
2014/03/12 职场文书
大学生村官个人对照检查材料(群众路线)
2014/09/26 职场文书
上课睡觉检讨书300字
2014/11/18 职场文书
烛光里的微笑观后感
2015/06/17 职场文书