看看PHP迭代器的内部执行过程(转)
1 class myIterator implements Iterator {
2 private $position = 0;
3 private $array = array(
4 "first_element",
5 "second_element",
6 "last_element",
7 );
8
9 public function __construct() {
10 $this->position = 0;
11 }
12
13 function rewind() {
14 var_dump(__METHOD__);
15 $this->position = 0;
16 }
17
18 function current() {
19 var_dump(__METHOD__);
20 return $this->array[$this->position];
21 }
22
23 function key() {
24 var_dump(__METHOD__);
25 return $this->position;
26 }
27
28 function next() {
29 var_dump(__METHOD__);
30 ++$this->position;
31 }
32
33 function valid() {
34 var_dump(__METHOD__);
35 return isset($this->array[$this->position]);
36 }
37 }
38
39 $it = new myIterator;
40
41 foreach($it as $key => $value) {
42 echo '输出键值:';
43 var_dump($key, $value);
44 //echo $key;
45 echo "\n";
46 }
程序运行输出:
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 检查当前位置的有效性
如果不是很清楚迭代器的内容工作流程,可以查看下面的迭代器对数组的遍历过程:
/**
*
*/
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迭代器的内部执行过程
下面我们来了解如何实现一个自定义的迭代器,然后再开始慢慢理解迭代器的内部工作原理.先来看一个官方的例子: class myIterator implements Iterator { private ...
- 看看PHP迭代器的内部执行过程
class myIterator implements Iterator { private $position = 0; private $array = array( "first_el ...
- CLRMonitor - 跟踪CLR内部执行过程工具
CLRMonitor v1.0.1511.13 点击此处下载 软件介绍:这款软件主要用于跟踪CLR内部执行过程,定位当前程序执行的命名空间以及方法名等信息.可以迅速找到被跟踪程序的当前执行方法名.本软 ...
- 当程序执行一条查询语句时,MySQL内部到底发生了什么? (说一下 MySQL 执行一条查询语句的内部执行过程?
先来个最基本的总结阐述,希望各位小伙伴认真的读一下,哈哈: 1)客户端(运行程序)先通过连接器连接到MySql服务器. 2)连接器通过数据库权限身份验证后,会先查询数据库缓存是否存在(之前执行过相同条 ...
- Struts2内部执行过程
首先是Struts2的流程图. 一.当有一个请求的时候.执行以下流程. 1 客户端初始化一个指向Servlet容器的请求: 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做Act ...
- mysql系列二、mysql内部执行过程
向MySQL发送一个请求的时候,MySQL到底做了什么 客户端发送一条查询给服务器. 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器端进行SQL解析.预 ...
- Python内部执行过程
一.编译过程概述 当我们执行Python代码的时候,在Python解释器用四个过程“拆解”我们的代码,最终被CPU执行返回给用户. 首先当用户键入代码交给Python处理的时候会先进行词法分析,例如用 ...
- C# 加法运算内部执行过程
1,转换成32为或者64为的数字 2,进行运算 3,算出结果后为int32或者int64,进行类型转化得到自己需要的类型
- SQL SERVER 2008:内部查询处理器错误: 查询处理器在执行过程中遇到意外错误
今天一个同事突然告诉我,以前跑得很正常的一个SQL语句,执行时突然报如下错误: 消息1222,级别16,状态18,第1 行 已超过了锁请求超时时段. ...
随机推荐
- exit()和_exit()的区别
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/HAHAandHEHE/article/de ...
- Day30 BigInteger和BigDecimal
BigInteger与BigDecimal BigInteger类 Integer类作为int的包装类,能存储的最大整型值为2 31-1,Long类也是有限的, 最大为2 63-1.如果要表示再大的整 ...
- TheSuperego 实验六 团队作业3:项目需求分析与原型设计
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 团队名称 TheSuperego 团队成员分工描述 杨丽霞:组织QQ会议,合理明确组内分工,推进任务,实施关于我们原型设计陈来弟:负 ...
- MySQL 基础、安装、配置
1. MySQL 基础 1.1 什么是数据库? 1.2 数据库的类型 1.3 关系型数据库的优点 1.4 MySQL 简介 1.5 MySQL 数据类型 1.6 Mysql 存储引擎 1.7 MySQ ...
- AI框架外部用户贡献代码
AI框架外部用户贡献代码 概述 飞桨是百度自主研发的一款开源的深度学习框架,是主流深度学习框架中首个完全国产化的产品,已经在农业.医疗.林业.科研.服务等领域成功应用.无论是已入职场的深度学习从业者. ...
- C#将DataTable数据导出CSV文件
C#将DataTable数据导出CSV文件通用方法! //导出按钮调用导出方法 protected void btnCSV_Click(object sender, EventArgs e) ...
- 《python网络数据采集》笔记1
第一部分-创建爬虫 1.urllib 1)urllib.request request.urlopen(url) request.urlretrieve 可以根据文件的 URL 下载文件 2)urll ...
- Linux学习笔记:linux命令之目录处理命令
目录处理命令 ls 命令名称:ls 英文原意:list 执行权限:所有用户 功能:显示目录文件 语法:ls 选项[-ald] [文件或目录] -a:显示所有文件,包括隐藏文件 -l:详细信息显示 -d ...
- Handler_read_*的总结
在分析一个SQL的性能好坏时,除了执行计划,另外一个常看的指标是"Handler_read_*"相关变量. Handler_read_key Handler_read_first ...
- 【渗透实战】记一次艰难的内网漫游第四期_蹭我WIFI?看我如何利用组合拳日进蹭网者内网
/文章作者:Kali_MG1937 CSDN博客ID:ALDYS4 QQ:3496925334/ 内网漫游系列第三期:[渗透实战]记一次艰难的内网漫游第三期_我是如何利用APT攻击拿到内网最高权限的 ...