迭代器(Iterator)模式,在一个很常见的过程上提供了一个抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代。

迭代有几种不同的具体执行方法:在数组属性,集合对象,数组,甚至一个查询结果集之上迭代。

在PHP官方手册中可以找到完整的SPL迭代器列表。得益于对PHP的强力支持,使用迭代器模式的大部分工作都包括在标准实现中,下面的代码示例就利用了标准Iterator的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
//定义一个类,实现了Iterator的方法
class testIterator implements Iterator {
private $_content;
private $_index = 0;
//构造函数
public function __construct(array $content) {
$this->_content = $content;
}
//返回到迭代器的第一个元素
public function rewind() {
$this->_index = 0;
}
//检查当前位置是否有效
public function valid() {
return isset($this->_content[$this->_index]);
}
//返回当前元素
public function current() {
return $this->_content[$this->_index];
}
//返回当前元素的键
public function key() {
return $this->_index;
}
//向前移动到下一个元素
public function next() {
$this->_index++;
}
}
//定义数组,生成类时使用
$arrString array('jane','apple','orange','pear');
$testIterator new testIterator($arrString);
//开始迭代对象
foreach $testIterator as $key => $val ) {
echo $key '=>' $val '<br>';
}

运行可以看到如下结果:

1
2
3
4
0=>jane
1=>apple
2=>orange
3=>pear

如果有兴趣,可以在每一个函数里面开始处加上“var_dump(__METHOD__);”,这样就可以看到每个函数的调用顺序了,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
string(25) "testIterator::__construct"
string(20) "testIterator::rewind"
string(19) "testIterator::valid"
string(21) "testIterator::current"
string(17) "testIterator::key"
0=>jane
string(18) "testIterator::next"
string(19) "testIterator::valid"
string(21) "testIterator::current"
string(17) "testIterator::key"
1=>apple
string(18) "testIterator::next"
string(19) "testIterator::valid"
string(21) "testIterator::current"
string(17) "testIterator::key"
2=>orange
string(18) "testIterator::next"
string(19) "testIterator::valid"
string(21) "testIterator::current"
string(17) "testIterator::key"
3=>pear
string(18) "testIterator::next"
string(19) "testIterator::valid"

本文转自shayang8851CTO博客,原文链接:http://blog.51cto.com/janephp/1344851,如需转载请自行联系原作者

PHP设计模式(6)迭代器模式相关推荐

  1. 【GOF23设计模式】迭代器模式

    [GOF23设计模式]迭代器模式 来源:http://www.bjsxt.com/  一.[GOF23设计模式]_迭代器模式.JDK内置迭代器.内部类迭代器 1 package com.test.it ...

  2. [转载] Python进阶:设计模式之迭代器模式

    参考链接: Python中的迭代器 在软件开发领域中,人们经常会用到这一个概念--"设计模式"(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一 ...

  3. 每日学一个设计模式1——迭代器模式

    引言 精通设计模式是从码农脱颖而出的条件之一.跟着<图解设计模式>这本书学习设计模式,从今天开始,一天总结一个设计模式. 迭代器模式(一个一个遍历) 用处 隐藏遍历集合的内部结构,遍历不同 ...

  4. php迭代器实例,php设计模式之迭代器模式实例分析【星际争霸游戏案例】

    本文实例讲述了php设计模式之迭代器模式.分享给大家供大家参考,具体如下: 星际的任务关一般会有这样的设定:一开始电脑的农民不采矿,如果战斗打响,或者玩家造出第一个兵,电脑的农民开始采矿. 我们自然会 ...

  5. 设计模式之迭代器模式(Iterator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  6. 设计模式复习-迭代器模式

    Iterator.H #pragma once #include <list> #include <windows.h> using namespace std;/* 设计模式 ...

  7. php foreach 循环 判断index 小于多少_PHP设计模式之迭代器模式 - 硬核项目经理

    一说到这个模式,就不得不提循环语句.在<大话设计模式>中,作者说道这个模式现在的学习意义更大于实际意义,这是为什么呢?当然就是被foreach这货给整得.任何语言都有这种类似的语法可以方便 ...

  8. Java 设计模式之迭代器模式

    一.了解迭代器模式 1.1 什么是迭代器模式 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 迭代器模式把游走的任务放在迭代器上,而不是聚合上.这样简化了聚合的接口和 ...

  9. 设计模式:迭代器模式(Iterator)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  10. Android设计模式之——迭代器模式

    一.介绍 迭代器模式(Iterator Pattern)又称为游标(Cursor)模式,是行为型设计模式之一.迭代器模式算是一个比较古老的设计模式,其源于对容器的访问,比如Java中的List.Map ...

最新文章

  1. iOS-应用沙盒结构分析
  2. Logstash 参考指南(使用Filebeat Modules配置示例)
  3. 一个关于NHiberante,Linq数据源与UI交互引发的思考
  4. 两个点击事件共用一个方法_工作必技:教你简单方法一个电脑开两个,多个微信!...
  5. codeforces 650B - Image Preview
  6. java接口抽象方法_Java 接口 抽象类 抽象方法
  7. hitchhiker部署_《 Hitchhiker的Python机器学习指南》
  8. 如何在验证集加噪声_图像去噪:如何去其糟粕,取其精华?
  9. 周刷题第一期总结(two sum and two numbers)
  10. Z逆变换(2020.10.21)
  11. hibernate之多对多配置
  12. 用matlab产生chu序列和frank序列
  13. 【Wi-Fi】IEEE 802.11 Standards 之 802.11a/b/g/n/ac/ax初探
  14. 应运而生的环保APP
  15. H5接入支付流程-微信支付支付宝支付
  16. 电脑蓝屏c000021a代码错误
  17. iOS-Charts图表绘制一块平行X轴线性指标
  18. 计算机键盘清洗怎么弄,笔记本电脑键盘怎么清洗干净(专业户教你清洗键盘简易方法)...
  19. 2018年终总结之最有成就感的几件事
  20. 【axios源码】- 取消请求cancel模块研读解析

热门文章

  1. lua 初接触 --- The first time use Lua for programing
  2. ewebeditor在上传文件时,总是提示“请选择一个有效的文件”,
  3. RedHat 5.4 RHCE VSFTPD学习笔记
  4. DHCP详细配置实验总结
  5. Linux能否靠架构取得胜利
  6. 18/100. Path Sum III
  7. 关于301跳转的多种办法
  8. 日志分割工具cronolog
  9. spring整合activeMQ遇到异常:Error creating bean with name 'connectionFactory'
  10. CSS文本对齐text-align详解