这篇文章主要介绍了PHP设计模式之迭代器(Iterator)模式,结合实例形式详细分析了PHP迭代器模式的相关概念、原理、应用案例及操作注意事项,需要的朋友可以参考下
本文实例讲述了PHP设计模式之迭代器(Iterator)模式。分享给大家供大家参考,具体如下:
迭代器有时又称光标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如list或vector)上遍访的接口,设计人员无需关心容器物件的内容,现在呢,各种语言实作Iterator的方式皆不尽同,有些面向对象语言像Java, C#, Python, Delphi都已将Iterator的特性内建语言当中,完美的跟语言整合,我们称之隐式迭代器(implicit iterator),但像是C++语言本身就没有Iterator的特色,但STL仍利用template实作了功能强大的iterator。
但是,PHP5开始支持了接口, 并且内置了Iterator接口, 所以如果你定义了一个类,并实现了Iterator接口,那么你的这个类对象就是ZEND_ITER_OBJECT,否则就是ZEND_ITER_PLAIN_OBJECT。对于ZEND_ITER_PLAIN_OBJECT的类,foreach会通过HASH_OF获取该对象的默认属性数组,然后对该数组进行foreach,而对于ZEND_ITER_OBJECT的类对象,则会通过调用对象实现的Iterator接口相关函数来进行foreach。
咱们什么也别说,先来看下迭代器的定义,那就是提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部显示。它可帮助构造特定的对象,那些对象能够提供单一标准接口循环或迭代任何类型的可计数数据。来看下迭代器模式的结构图:
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";
}
运行之后的结果如下:
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 )//检查当前位置是否有效
}
完事,我们如果要进行遍历的类必须实现Iterator里面的抽象方法,如下:
class Season implements Iterator{
private $position = 0;//指针指向0
private $arr = array('春','夏','秋','冬');
public function rewind(){
return $this -> position = 0;
}
public function current(){
return $this -> arr[$this -> position];
}
public function key(){
return $this -> position;
}
public function next() {
++$this -> position;
}
public function valid() {
return isset($this -> arr[$this -> position]);
}
}
$obj = new Season;
foreach ($obj as $key => $value) {
echo $key.':'.$value."\n";
}
最后,咱们来看一个网上找的用迭代器模式来实现的一个斐波那契数列。
我们都知道,斐波那契数列通常做法是用递归实现,当然还有其它的方法,咱们这里用PHP的迭代器来实现一个斐波纳契数列,几乎没有什么难度,只是把类里的next()方法重写了一次。注释已经写到代码中,也是相当好理解的,如下:
class Fibonacci implements Iterator {
private $previous = 1;
private $current = 0;
private $key = 0;
public function current() {
return $this->current;
}
public function key() {
return $this->key;
}
public function next() {
// 关键在这里
// 将当前值保存到 $newprevious
$newprevious = $this->current;
// 将上一个值与当前值的和赋给当前值
$this->current += $this->previous;
// 前一个当前值赋给上一个值
$this->previous = $newprevious;
$this->key++;
}
public function rewind() {
$this->previous = 1;
$this->current = 0;
$this->key = 0;
}
public function valid() {
return true;
}
}
$seq = new Fibonacci;
$i = 0;
foreach ($seq as $f) {
echo "$f ";
if ($i++ === 15) break;
}
输出的结果如下:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610
好啦,本次记录就到这里了。
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
本文标题为:PHP设计模式之迭代器(Iterator)模式入门与应用详解
- php微信公众号开发之秒杀 2022-11-23
- Laravel balde模板文件中判断数据为空方法 2023-08-30
- PHP实现微信支付(jsapi支付)流程步骤详解 2022-10-09
- laravel实现按月或天或小时统计mysql数据的方法 2023-02-22
- PHP简单实现二维数组的矩阵转置操作示例 2022-10-02
- PHP中PDO事务处理操作示例 2022-10-15
- 用nohup命令实现PHP的多进程 2023-09-02
- windows下9款一键快速搭建PHP本地运行环境的好工具(含php7.0环境) 2023-09-02
- laravel通用化的CURD的实现 2023-03-17
- PHP仿tp实现mvc框架基本设计思路与实现方法分析 2022-10-18