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 5.0对象模型深度探索之绑定
Sep 05 PHP
PHP的FTP学习(二)[转自奥索]
Oct 09 PHP
php include,include_once,require,require_once
Sep 05 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
Oct 31 PHP
php 定义404页面的实现代码
Nov 19 PHP
解析php php_openssl.dll的作用
Jul 01 PHP
php上传文件常见问题总结
Feb 03 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
Apr 08 PHP
php析构函数的简单使用说明
Aug 24 PHP
PHP将二维数组某一个字段相同的数组合并起来的方法
Feb 26 PHP
php封装的验证码工具类完整实例
Oct 19 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
Feb 09 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的mssql数据库连接类实例
2014/11/28 PHP
Thinkphp3.2.3整合phpqrcode生成带logo的二维码
2016/07/21 PHP
Yii2实现ActiveForm ajax提交
2017/05/26 PHP
php-fpm.conf配置文件中文说明详解及重要参数说明
2018/10/10 PHP
jquery text()要注意啦
2009/10/30 Javascript
JQuery对checkbox操作 (循环获取)
2011/05/20 Javascript
基于jQuery实现图片的前进与后退功能
2013/04/24 Javascript
把input初始值不写value的具体实现方法
2013/07/04 Javascript
jquery获取当前点击对象的value方法
2014/02/28 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
2014/08/22 Javascript
7个让JavaScript变得更好的注意事项
2015/01/28 Javascript
BootStrapTable服务器分页实例解析
2016/12/20 Javascript
react学习笔记之state以及setState的使用
2017/12/07 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
浅谈Vue开发人员的7个最好的VSCode扩展
2021/01/20 Vue.js
json跨域调用python的方法详解
2017/01/11 Python
Python实现替换文件中指定内容的方法
2018/03/19 Python
解决Spyder中图片显示太小的问题
2018/04/27 Python
Django基础知识与基本应用入门教程
2018/07/20 Python
Python龙贝格法求积分实例
2020/02/29 Python
mac安装python3后使用pip和pip3的区别说明
2020/09/01 Python
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
html5 canvas-2.用canvas制作一个猜字母的小游戏
2013/01/07 HTML / CSS
英国奢侈品网站:MatchesFashion
2016/12/16 全球购物
Nike瑞典官方网站:Nike.com (SE)
2018/11/26 全球购物
Dogeared官网:在美国手工制作的珠宝
2019/08/24 全球购物
如何判断计算机可能已经中马
2013/03/22 面试题
医学院学生的自我评价分享
2013/11/19 职场文书
九年级家长会邀请函
2014/01/15 职场文书
幼儿园儿童节活动主持词+串词大全
2014/03/21 职场文书
给校长的建议书300字
2014/05/16 职场文书
2014年四风问题自我剖析材料
2014/09/15 职场文书
专升本学生毕业自我鉴定
2014/10/04 职场文书
2015年消防工作总结
2015/04/24 职场文书
MySQL 使用SQL语句修改表名的实现
2021/04/07 MySQL
Redis实现分布式锁的五种方法详解
2022/06/14 Redis