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 has encountered an Access Violation
Jan 15 PHP
php实现的遍历文件夹下所有文件,编辑删除
Jan 05 PHP
php 定界符格式引起的错误
May 24 PHP
PHP冒泡排序算法代码详细解读
Jul 17 PHP
php自定义函数实现JS的escape的方法示例
Jul 07 PHP
php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】
Apr 18 PHP
ThinkPHP实现附件上传功能
Apr 27 PHP
在laravel中使用Symfony的Crawler组件分析HTML
Jun 19 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
Dec 07 PHP
Laravel框架Auth用户认证操作实例分析
Sep 29 PHP
PHP编程一定要改掉的5个不良习惯
Sep 18 PHP
Laravel的加密解密与哈希实例讲解
Mar 24 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 access 数据连接与读取保存编辑数据的实现代码
2010/05/12 PHP
发一个php简单的伪原创程序,配合商城采集用的
2010/10/12 PHP
解析php curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
php中filter函数验证、过滤用户输入的数据
2014/01/13 PHP
ThinkPHP令牌验证实例
2014/06/18 PHP
教你php如何实现验证码
2016/01/20 PHP
PHP实现补齐关闭的HTML标签
2016/03/22 PHP
js setattribute批量设置css样式
2009/11/26 Javascript
autoPlay 基于jquery的图片自动播放效果
2011/12/07 Javascript
asp.net+js实现金额格式化
2015/02/27 Javascript
js实现简单的联动菜单效果
2015/08/19 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
2015/11/18 Javascript
JavaScript文本框脚本编写的注意事项
2016/01/25 Javascript
基于jQuery的AJAX和JSON实现纯html数据模板
2016/08/09 Javascript
javascript特殊文本输入框网页特效
2016/09/13 Javascript
JavaScript触发onScroll事件的函数节流详解
2016/12/14 Javascript
根据Bootstrap Paginator改写的js分页插件
2016/12/25 Javascript
JavaScript中Math对象的方法介绍
2017/01/05 Javascript
nodejs根据ip数组在百度地图中进行定位
2017/03/06 NodeJs
jQuery仿移动端支付宝键盘的实现代码
2018/08/15 jQuery
vuex 动态注册方法 registerModule的实现
2019/07/03 Javascript
Node使用Nodemailer发送邮件的方法实现
2020/02/24 Javascript
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
更改Python命令行交互提示符的方法
2015/01/14 Python
python正则实现提取电话功能
2018/02/24 Python
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
python利用Tesseract识别验证码的方法示例
2019/01/21 Python
python 获得任意路径下的文件及其根目录的方法
2019/02/16 Python
python银行系统实现源码
2019/10/25 Python
Python SELENIUM上传文件或图片实现过程
2019/10/28 Python
python创建学生成绩管理系统
2019/11/22 Python
白兰氏健康Mall:BRAND’S
2017/11/13 全球购物
涉外经济法专业毕业生推荐信
2013/11/24 职场文书
复核员上岗演讲稿
2014/01/05 职场文书
表演方阵解说词
2014/02/08 职场文书
2015年村党支部工作总结
2015/04/30 职场文书