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 echo 输出字符串函数详解
May 13 PHP
使用PHP实现二分查找算法代码分享
Jun 24 PHP
CodeIgniter生成网站sitemap地图的方法
Nov 13 PHP
用 Composer构建自己的 PHP 框架之构建路由
Oct 30 PHP
通过php添加xml文档内容的方法
Jan 23 PHP
yii2.0实现创建简单widgets示例
Jul 18 PHP
Yii CFileCache 获取不到值的原因分析
Feb 08 PHP
PHP memcache在微信公众平台的应用方法示例
Sep 13 PHP
laravel手动创建数组分页的实现代码
Jun 07 PHP
PHP的JSON封装、转变及输出操作示例
Sep 27 PHP
PHP7创建销毁session的实例方法
Feb 03 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
Mar 18 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
ecshop 订单确认中显示省市地址信息的方法
2010/03/15 PHP
php实现的百度搜索某地天气的小偷代码
2014/04/23 PHP
PHP基于phpqrcode类生成二维码的方法详解
2018/03/14 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
BOOM vs RR BO5 第一场 2.14
2021/03/10 DOTA
jQuery select控制插件
2009/08/17 Javascript
GRID拖拽行的实例代码
2013/07/18 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
2013/10/15 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
Position属性之relative用法
2015/12/14 Javascript
Vue 2.x教程之基础API
2017/03/06 Javascript
vue 实现 tomato timer(蕃茄钟)实例讲解
2017/07/24 Javascript
详细介绍RxJS在Angular中的应用
2017/09/23 Javascript
webpack配置导致字体图标无法显示的解决方法
2018/03/06 Javascript
原生JS实现随机点名项目的实例代码
2019/04/30 Javascript
详解微信小程序支付流程与梳理
2019/07/16 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
2019/08/20 Javascript
微信小程序弹窗禁止页面滚动的实现代码
2020/12/30 Javascript
[03:56]还原FTP电影首映式 DOTA2群星拼出遗迹世界
2014/03/26 DOTA
简单介绍Ruby中的CGI编程
2015/04/10 Python
python实现远程通过网络邮件控制计算机重启或关机
2018/02/22 Python
python pandas写入excel文件的方法示例
2019/06/25 Python
在Python IDLE 下调用anaconda中的库教程
2020/03/09 Python
Python实现石头剪刀布游戏
2021/01/20 Python
python 第三方库paramiko的常用方式
2021/02/20 Python
html如何对span设置宽度
2019/10/30 HTML / CSS
C语言基础笔试题
2013/04/27 面试题
Android interview questions
2016/12/25 面试题
Linux文件系统类型
2012/02/15 面试题
校友会欢迎辞
2014/01/13 职场文书
材料工程专业毕业生求职信
2014/03/04 职场文书
企业管理毕业生求职信
2014/03/11 职场文书
家居装修公司创业计划书范文
2014/03/20 职场文书
2015年高中班主任工作总结
2015/04/30 职场文书
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL
教你利用Nginx 服务搭建子域环境提升二维地图加载性能的步骤
2021/09/25 Servers