PHP设计模式之迭代器模式

迭代器是执行迭代任务的对象,通常逐个访问某些来源的元素。

使用迭代器模式操作数组

迭代操作第一版:普通数组的操作

demo1.php

1
2
3
4
5
6
7
8
9
10
header('Content-Type:text/html; charset=utf-8');

$array = ['A', 'B', 'C', 'D', 'E'];

foreach($array as $key => $value){
echo $key.'--'.$value.'<br />';
}

echo $array[2];
echo $array[2+1];

迭代操作第二版:使用迭代器类来操作数组

demo2.php

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
38
39
40
41
42
43
44
45
46
47
<?php
header('Content-Type:text/html; charset=utf-8');

class ArrayI{
private $array;
private $index = 0;
private $length;

public function __construct($array){
$this->array = $array;
$this->length = sizeof($array) - 1;
}

// 得到数组
public function getArray(){
return $this->array;
}

// 得到当前下标元素
public function getContent(){
return $this->array[$this->index];
}

// 得到最后一个元素
public function getLastContent(){
return $this->array[$this->length];
}

// 移位下一条
public function next(){
++$this->index;
}
}

$array = ['A', 'B', 'C', 'D', 'E'];

$array_iterator = new ArrayI($array);

foreach($array_iterator->getArray() as $key => $value){
echo $key.'--'.$value.'<br />';
}

echo $array_iterator->getContent();
echo $array_iterator->getContent();
$array_iterator->next();
echo $array_iterator->getContent();
echo $array_iterator->getLastContent();

PHP5 中内置了 SPL(PHP 标准库),里面包含了大量的迭代器接口。

通过继承迭代器实现对对象的遍历

demo3.php

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
38
39
40
<?php
header('Content-Type:text/html; charset=utf-8');

class AllUser implements Iterator{
private $ids;
private $data = [];
private $index;

public function __construct(){
$db = Factory::getDatabase();
$result = $db->query("select id from user");
$this->ids = $result->fetch_all(MYSQLI_ASSOC);
}

public function current(){
$id = $this->ids[$this->index]['id'];
return Factory::getUser($id);
}

public function next(){
++$this->index;
}

public function valid(){
return $this->index < count($this->ids);
}

public function rewind(){
$this->index = 0;
}

public function key(){
return $this->index;
}
}

$users = new AllUser();
foreach($users as $user){
var_dump($user->name);
}

  1. 迭代器模式,在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素。
  2. 相比于传统的编程模式,迭代器模式可以隐藏遍历元素的所需的操作。