php 迭代器
迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。
百度百科: http://baike.baidu.com/view/9791023.htm?fr=aladdin
解释
上面这名话可能多数人看得似懂非懂,什么叫做访问容器的各个元素,又不暴露对象的内部细节呢?尤其是网上很多例子都过于简单,直接扔一个数组,然后去实现了迭代器的各种方法,如下:
<?php
class SomeCollection implements Iterator
{
protected $_data;
protected $_pos;
function __construct($data)
{
$this->_data = $data;
$this->_pos = 0;
}
function current()
{
$row = $this->_data[$this->_pos];
return $row;
}
function next()
{
$this->_pos++;
}
function valid()
{
return $this->_pos >= 0 && $this->_pos <count($this->_data);
}
function key()
{
return $this->_pos;
}
function rewind()
{
$this->_pos = 0;
}
}
$array = array(
array('url' => 'www.zeroplace.cn'),
array('url' => 'www.baidu.com'),
array('url' => 'www.sina.com.cn'),
array('url' => 'www.google.com'),
array('url' => 'www.qq.com'),
);
$coll = new SomeCollection($array);
foreach ($coll as $row) {
echo $row['url'], "\n";
}
这样的例子就不能够说明迭代器的作用,因为它不能说明迭代器隐藏了内部的数据结构,传进去的和返回出来的完全是一样的数据。
迭代器怎么用
我只能说在不同的场合有不同的用法。比如我把上面的例子修改一下,可能就可以说明迭代器可以隐藏数据结构这个特性了。请看如下代码。
<?php
class SomeCollection implements Iterator
{
protected $_data;
protected $_pos;
function __construct($data)
{
$this->_data = $data;
$this->_pos = 0;
}
function current()
{
$row = $this->_data[$this->_pos];
$row['ip'] = gethostbyname($row['url']);
return $row;
}
function next()
{
$this->_pos++;
}
function valid()
{
return $this->_pos >= 0 && $this->_pos <count($this->_data);
}
function key()
{
return $this->_pos;
}
function rewind()
{
$this->_pos = 0;
}
}
$array = array(
array('url' => 'www.zeroplace.cn'),
array('url' => 'www.baidu.com'),
array('url' => 'www.sina.com.cn'),
array('url' => 'www.google.com'),
array('url' => 'www.qq.com'),
);
$coll = new SomeCollection($array);
foreach ($coll as $row) {
echo $row['url'], ' ', $row['ip'], "\n";
}
这样我觉得就可以说明迭代器能隐藏数据结构这个特性了。我们的数据传进去的时候每行数据只有一个url属性,但是迭代出来的时候多了一个ip属性。这样对外部的使用者来说就是有两个属性(url和ip), 它不需要知道这个ip字段是创建者传入的还是在迭代器中产生的。
更一般的做法
这里current方法返回的是一个关联数组,更常规的做法是返回一个对象,此时这个迭代器可能还需要一个对象创建器。
php 迭代器的更多相关文章
- 匹夫细说C#:庖丁解牛迭代器,那些藏在幕后的秘密
		0x00 前言 在匹夫的上一篇文章<匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置>的最后,匹夫以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够过瘾,很多需要说清楚 ... 
- 轻量级“集合”迭代器-Generator
		Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下G ... 
- C#设计模式-迭代器模式
		一. 迭代器(Iterator)模式 迭代器是针对集合对象而生的,对于集合对象而言,必然涉及到集合元素的添加删除操作,同时也肯定支持遍历集合元素的操作,我们此时可以把遍历操作也放在集合对象中,但这样的 ... 
- 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)
		上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ... 
- Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化
		本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ... 
- 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。
		最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ... 
- Java迭代器
		迭代器在其实就是指针,读取集合或者数组中的一个值,读完以后又指向下一条数据. iterator() 迭代器只读,不能改效率要比for循环高 迭代器的一些方法: HasNext() 如果仍有元素可以迭代 ... 
- Python 生成器与迭代器 yield 案例分析
		前几天刚开始看 Python ,后因为项目突然到来,导致Python的学习搁置了几天.然后今天看回Python 发现 Yield 这个忽然想不起是干嘛用的了(所以,好记性不如烂笔头.).然后只能 花点 ... 
- 设计模式02迭代器(java)
		先贴代码,有空来写内容. 1.定义集合 import java.util.List; import java.util.ArrayList; //coollection是我自己定义的一个集合,因为要写 ... 
- JAVA编程思想(第四版)学习笔记----11.5 List,11.6迭代器
		Collection类的层次结构图(来源与网络)如下所示: 接口:Iterator<T> public interface Iterable<T> Iterable<T& ... 
随机推荐
- 制作3D图片立方体旋转特效
			<!DOCTYPE html><html><head><meta charset="utf-8" /><title>CS ... 
- wget ftp
			今天操作远端机器的时候发现少一个安装包, 需要传到对方的机器上,还能使用通过的老办法,直接SSH连上去了,发现传的很慢, 只有40K的样子, 看时间还需要二个多小时就有点受不了了.想想有一台FTP服务 ... 
- hbase与mapreduce集成
			一:运行给定的案例 1.获取jar包里的方法 2.运行hbase自带的mapreduce程序 lib/hbase-server-0.98.6-hadoop2.jar 3.具体运行 4.运行一个小方法 ... 
- javaScript没有块级作用域
			1.如下,变量i,j,k 的作用域是相同的. function test(obj){ var i= 0; if(typeof obj == "object"){ var j = 0 ... 
- php--字符串函数分类总结
			PHP语言中的字符串函数也是一个比较易懂的知识.今天我们就为大家总结了将近12种PHP字符串函数,希望对又需要的朋友有所帮助,增加读者朋友的PHP知识库. 1.查找字符位置函数 strpos($s ... 
- Object C语法学习
			#synthesize关键字: 根据@property设置,自动生成成员变量相应的存取方法,从而可以使用点操作符来方便的存取该成员变量 . @implementation 关键字,表明类的实现 @en ... 
- Jquery下拉效果
			$('#触发元素').hover(function(){ $('#框框').slideDown(); //展开(动画效果)},function(){ $('#框框').slideUp(); //收起( ... 
- 【Android Studio快捷键】之导入相应包声明(import packages)
			可能import 单个声明的快捷键大家都很容易找到,Alt+Enter.但是如果我要一次性import文件中所有的声明,这个快捷键是什么呢,找啊找的,就是没找到,以前在Eclipse是Ctrl+1,但 ... 
- LeetCode Word Break II
			原题链接在这里:https://leetcode.com/problems/word-break-ii/ 题目: Given a string s and a dictionary of words ... 
- jquery效果
			//隐藏显示 <!doctype html> <html lang="en"> <head> <meta charset="UT ... 
