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和ACCESS写聊天室(五)
Oct 09 PHP
php 静态页面中显示动态内容
Aug 14 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
Aug 25 PHP
PHP 生成N个不重复的随机数
Jan 21 PHP
PIGCMS 如何关闭聊天机器人
Feb 12 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
Mar 26 PHP
CodeIgniter生成静态页的方法
May 17 PHP
Yii2中使用join、joinwith多表关联查询
Jun 30 PHP
PHP简单实现数字分页功能示例
Aug 24 PHP
PHP云打印类完整示例
Oct 15 PHP
php 函数使用可变数量的参数方法
May 02 PHP
php桥接模式应用案例分析
Oct 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
Windows下XDebug 手工配置与使用说明
2010/07/11 PHP
PHP计算一年多少个星期和每周的开始和结束日期
2014/07/01 PHP
一个经典的PHP文件上传类分享
2014/11/18 PHP
Opcache导致php-fpm崩溃nginx返回502
2015/03/02 PHP
PHP使用内置dir类实现目录遍历删除
2015/03/31 PHP
浅谈php的优缺点
2015/07/14 PHP
深入浅析用PHP实现MVC
2016/03/02 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
2018/12/20 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
2019/01/16 PHP
解决thinkphp5未定义变量会抛出异常,页面错误,请稍后再试的问题
2019/10/16 PHP
jQuery表格排序组件-tablesorter使用示例
2014/05/26 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
浅谈window对象的scrollBy()方法
2015/07/15 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
2015/11/02 Javascript
jquery UI Datepicker时间控件的使用方法(基础版)
2015/11/07 Javascript
ES6新特性七:数组的扩充详解
2017/04/21 Javascript
nodejs socket实现的服务端和客户端功能示例
2017/06/02 NodeJs
Vue使用Three.js加载glTF模型的方法详解
2020/06/14 Javascript
原生js实现九宫格拖拽换位
2021/01/26 Javascript
利用Python命令行传递实例化对象的方法
2016/11/02 Python
Python Pandas实现数据分组求平均值并填充nan的示例
2019/07/04 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
浅析Python3 pip换源问题
2020/01/06 Python
python相对企业语言优势在哪
2020/06/12 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
使用CSS3 制作一个material-design 风格登录界面实例
2016/12/12 HTML / CSS
html5 canvas 实现光线沿不规则路径运动
2020/04/20 HTML / CSS
Fossil美国官网:化石手表、手袋、首饰及配饰
2019/02/17 全球购物
优纳科技软件测试面试题
2012/05/15 面试题
营销与策划专业毕业生求职信
2013/11/01 职场文书
毕业生个人的求职信范文
2013/12/03 职场文书
采购部部门职责
2013/12/15 职场文书
领导视察欢迎词
2014/01/15 职场文书
食品安全工作实施方案
2014/03/26 职场文书
德劲DE1102数字调谐收音机机评
2022/04/07 无线电