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 相关文章推荐
oracle资料库函式库
Oct 09 PHP
PHP通过正则表达式下载图片到本地的实现代码
Sep 19 PHP
php中防止SQL注入的最佳解决方法
Apr 25 PHP
数组与类使用PHP的可变变量名需要的注意的问题
Jun 20 PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
Jun 29 PHP
ThinkPHP实现多数据库连接的解决方法
Jul 01 PHP
php使用NumberFormatter格式化货币的方法
Mar 21 PHP
Zend Framework教程之Zend_Db_Table_Row用法实例分析
Mar 21 PHP
PHP简单实现记录网站访问量功能示例
Jun 06 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
Jun 13 PHP
通过PHP实现用户注册后邮箱验证激活
Nov 10 PHP
详解thinkphp的Auth类认证
May 28 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
人族 Terran 魔法与科技
2020/03/14 星际争霸
jQuery dialog 异步调用ashx,webservice数据的代码
2010/08/03 Javascript
让浏览器非阻塞加载javascript的几种方法小结
2011/04/25 Javascript
jquery 使用点滴函数代码
2011/05/20 Javascript
javascript:void(0)的作用示例介绍
2013/10/28 Javascript
JQuery教学之性能优化
2014/05/14 Javascript
jQuery简单tab切换效果实现方法
2015/04/08 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
原生javascript实现分享到朋友圈功能 支持ios和android
2016/05/11 Javascript
AngularJS  $on、$emit和$broadcast的使用
2016/09/05 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
2017/03/19 Javascript
原生js封装自定义滚动条
2017/03/24 Javascript
用原生 JS 实现 innerHTML 功能实例详解
2019/04/03 Javascript
如何解决vue在ios微信"复制链接"功能问题
2020/03/26 Javascript
vue 组件间的通信之子组件向父组件传值的方式
2020/07/29 Javascript
详解ES6 中的Object.assign()的用法实例代码
2021/01/11 Javascript
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
[28:07]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第二场 12.13
2020/12/17 DOTA
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
2018/01/09 Python
Python实现扣除个人税后的工资计算器示例
2018/03/26 Python
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
python类的实例化问题解决
2019/08/31 Python
如何理解Python中的变量
2020/06/01 Python
Python xlrd模块导入过程及常用操作
2020/06/10 Python
python判断是空的实例分享
2020/07/06 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
css3实现背景颜色渐变让图片不再是唯一的实现方式
2012/12/18 HTML / CSS
英格兰橄榄球商店:England Rugby Store
2016/12/17 全球购物
优秀的教师个人的中文求职信
2013/09/21 职场文书
工程售后服务方案
2014/06/08 职场文书
公司人事专员岗位职责
2014/08/11 职场文书
致800米运动员广播稿(10篇)
2014/10/17 职场文书
世界气象日活动总结
2015/02/27 职场文书
MongoDB安装使用并实现Python操作数据库
2021/06/28 MongoDB
python数字转对应中文的方法总结
2021/08/02 Python
nginx中封禁ip和允许内网ip访问的实现示例
2022/03/17 Servers