使用迭代模式遍历所有的对象的时候,都必须实现Traversable(遍历)接口。但是Traversable是一个内部的类,只有用c语言编写的类才可以实现Traversable实现。如果我们在自定义的 类中实现它,会报错。那么我们要实现对象的遍历,就必须通过Iterator或者IteratorAggregate接口实现Traversable接口。

一,首先说说Iterator接口

它是在c语言中定义的,都是抽象方法,所以我们在实现接口的时候,就必须定义这些方法,代码如下:

Iterator extends Traversable {
/* 方法 */
abstract public mixed current ( void )
abstract public scalar key ( void )
abstract public void next ( void )
abstract public void rewind ( void )
abstract public boolean valid ( void )
}

接着我们在PHP中实现接口Iterator,代码如下:

//自定义类实现接口Iterator
class myIterator implements Iterator {
private $position = 0;
private $array = array(
"firstelement",
"secondelement",
"lastelement",
); public function __construct() {
$this->position = 0;
}
//定义rewind()-将数组指针移动到数组的开头位置
function rewind() {
var_dump(__METHOD__);
$this->position = 0;
}
//定义current()-返回当前的值
function current() {
var_dump(__METHOD__);
return $this->array[$this->position];
}
//定义可以key()-返回当前的键值
function key() {
var_dump(__METHOD__);
return $this->position;
}
//定义next()-将数组指针向前进一位指向下一个数组元素
function next() {
var_dump(__METHOD__);
++$this->position;
}
//定义valid()-确定当前元素是否存在,并且必须在next()和rewind()方法之后才可以调用
function valid() {
var_dump(__METHOD__);
return isset($this->array[$this->position]);
}
} $it = new myIterator; foreach($it as $key => $value) {
var_dump($key, $value);
echo "\n";
}

代码运行结果如下:

大家可能不明白,为什么利用foreach()就可以循环打印出类的属性,程序执行的顺序看我的注释,再次提醒大家注意
“定义valid()-确定当前元素是否存在,并且必须在next()和rewind()方法之后才可以调用”。

string(18) "myIterator::rewind" ----------程序开始执行首先调用rewind()函数,将数组指针移到数组开头位置
string(17) "myIterator::valid" ----------接着调用valid()当前元素是否存在,这个函数每次紧跟rewind()和next()函数被调用
string(19) "myIterator::current" ----------调用current()获取当前的值
string(15) "myIterator::key" ----------调用key()获取当前位置的键值
int(0)
string(12) "firstelement"

string(16) "myIterator::next" ----------上一步获取当前位置,肯定要调用next(),获取下一个位置的指针,即指针向下移动
string(17) "myIterator::valid" ----------判断当前元素是否存在
string(19) "myIterator::current" ----------如果存在,获取当前元素
string(15) "myIterator::key" ----------获取当前键值,为了下一步指针向前移动
int(1)
string(13) "secondelement"

string(16) "myIterator::next" ---------指针指向下一个元素
string(17) "myIterator::valid" ---------判断当前元素是否存在
string(19) "myIterator::current" ---------元素存在,获取当前的元素
string(15) "myIterator::key" ---------获取当前键值
int(2)
string(11) "lastelement"

string(16) "myIterator::next" ---------指针指向下一个位置
string(17) "myIterator::valid" ---------判断当前位置是否有值。如果有获取值,没有就结束遍历

二 ,IteratorAggregate接口

是用来将Iterator接口要求实现的5个方法委托给其他类(比如ArrayIterator)来实现

(1) ArrayIterator接口:允许从PHP数组中创建一个迭代器。上面我们通过实现Iterator接口实现迭代器,但是ArrayIterator可以直接跳过,实现同样的功能。

(2)当ArrayIterator迭代器和IteratorAggregate类一起使用的时候,直接免去Iterator创建方法的工作,所以在实现IteratorAggregate类中的方法getIterator时候,返回一个ArrayIterator接口就好。

(3) IteratorAggregate的c语言实现代码:定义抽象方法getIterator,所以实现接口的时候,必须定义该方法

IteratorAggregate extends Traversable {
/* 方法 */
abstract public Traversable getIterator ( void )
}
class myData implements IteratorAggregate {
public $property1 = "Public property one";
public $property2 = "Public property two";
public $property3 = "Public property three"; public function __construct() {
$this->property4 = "last property";
}
//定义方法----getIterator()---返回一个Iterator类的实例
public function getIterator() {
//ArrayIterator()接口可以创建一个Iterator实例
return new ArrayIterator($this);
}
} $obj = new myData(); foreach($obj as $key => $value) {
var_dump($key, $value);
echo "\n";
}

运行如下:
string(9) "property1"
string(19) "Public property one"

string(9) "property2"
string(19) "Public property two"

string(9) "property3"
string(21) "Public property three"

string(9) "property4"
string(13) "last property"

 

PHP迭代器:Iterator和IteratorAggregate的更多相关文章

  1. 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

    最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...

  2. VC++ 迭代器 iterator, const_iterator, const iterator

    迭代器 iterator, const_iterator, const iterator 迭代器iterator的作用类似于指针. (1)iterator只有针对制定<类型>的容器才有效. ...

  3. 迭代器iterator

    现在接着上篇的,写一来标识vector 的元素的对象迭代器iterator: 还是通过具体代码举例: 下面我讲了一个我暑期团队的故事哦~~: #include<iostream> #inc ...

  4. c++中的迭代器 iterator

    迭代器iterator的作用类似于指针. iterator只有针对制定<类型>的容器才有效.例如: vector<int> vec; vector<int>::it ...

  5. Python的迭代器(iterator)和生成器(constructor)

    一.迭代器(iterator) 1.迭代器的概述 在Python中,for循环可以用于Python中的任何类型,包括列表.元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器 迭代器 ...

  6. 设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释

    迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(ite ...

  7. Java 实现迭代器(Iterator)模式

    类图 /** * 自己定义集合接口, 相似java.util.Collection * 用于数据存储 * @author stone * */ public interface ICollection ...

  8. C++迭代器 iterator【转】

    1. 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型.(1) 每种容器类型都定义了自己的迭代器类型,如vector:vector<int>::iterator iter ...

  9. Java迭代器Iterator

    之前我们实现了迭代器模式,很多编程语言实际上已经内置了迭代器类,比如Java就为我们实现了迭代器Iterator.我们首先来看Iterator中的源码. 通过JDK源码我们发现Iterator是一个接 ...

随机推荐

  1. 【翻译】IdentityServer4:基于资源的配置

    这篇文章基于https://leastprivilege.com/2016/12/01/new-in-identityserver4-resource-based-configuration/进行翻译 ...

  2. tomcat知识(一)

    1.tomcat配置javaWeb项目常见错误: ①:端口占用 ②:未配置JAVA_HOME环境变量 2.tomcat修改端口号 tomcat安装路径下面找到conf文件夹,修改server.xml文 ...

  3. Python——Django目录说明

    一.Django安装好后,建立djangosite的开发项目 #django-admin startproject djangosite 二.djangosite目录内容 ''' djangosite ...

  4. Qt中实现将float类型转换为QString类型

    在使用Qt Creator编程时,难免会用到将float类型转换为QString类型的时候下面是我所有的方法: 1. 将QString类型转化为float类型,很简单 QString data; fl ...

  5. BZOJ4621 Tc605(动态规划)

    容易发现最终序列所有数字的相对顺序不变,一个数字可能的覆盖范围由两边第一个比它大的数决定,且若不考虑次数限制所有这样的序列都可以变换得到.对于一个序列,其需要的最少变换次数显然就是覆盖了别的位置的数的 ...

  6. 【XSY3126】异或II 数学

    题目描述 给你一个序列 \(a_0,a_1,\ldots,a_{n-1}\).你要进行 \(t\) 次操作,每次操作是把序列 \(x\) 变为序列 \(y\),满足 \(y_i=\oplus_{j=0 ...

  7. 【XSY2849】陈姚班 平面图网络流 最短路 DP

    题目描述 有一个\(n\)行\(m\)列的网格图. \(S\)到第一行的每一个点都有一条单向边,容量为\(\infty\). 最后一行的每个点到\(T\)都有一条单向边,容量为\(\infty\). ...

  8. Super Mario HDU - 4417 (主席树)

    Mario is world-famous plumber. His “burly” figure and amazing jumping ability reminded in our memory ...

  9. [SHOI2014]三叉神经树

    题目描述 计算神经学作为新兴的交叉学科近些年来一直是学术界的热点.一种叫做SHOI 的神经组织因为其和近日发现的化合物 SHTSC 的密切联系引起了人们的极大关注. SHOI 组织由若干个 SHOI ...

  10. 深度学习中Embedding的理解

    这学期为数不多的精读论文中基本上都涉及到了Embedding这个概念,下面结合自己的理解和查阅的资料对这个概念进行一下梳理. ===================================== ...