迭代器模式(Iterator)女阀,又叫做游標(biāo)(Cursor)模式闰渔。提供一種方法訪問(wèn)一個(gè)容器(Container)對(duì)象中各個(gè)元素晰房,而又不需暴露該對(duì)象的內(nèi)部細(xì)節(jié)滨嘱。
當(dāng)你需要訪問(wèn)一個(gè)聚合對(duì)象拉庵,而且不管這些對(duì)象是什么都需要遍歷的時(shí)候灿椅,就應(yīng)該考慮使用迭代器模式。另外钞支,當(dāng)需要對(duì)聚集有多種方式遍歷時(shí)茫蛹,可以考慮去使用迭代器模式。迭代器模式為遍歷不同的聚集結(jié)構(gòu)提供如開始烁挟、下一個(gè)婴洼、是否結(jié)束、當(dāng)前哪一項(xiàng)等統(tǒng)一的接口撼嗓。
PHP標(biāo)準(zhǔn)庫(kù)(SPL)中提供了迭代器接口 Iterator柬采,要實(shí)現(xiàn)迭代器模式,實(shí)現(xiàn)該接口即可且警。
示例代碼:
class String implements Iterator {
private $string;
public function __construct($string)
{
$this->string = $this->strToArray($string);
}
private function strToArray($string,$l=0) {
if ($l > 0) {
$ret = array();
$len = mb_strlen($string, "UTF-8");
for ($i = 0; $i < $len; $i += $l) {
$ret[] = mb_substr($string, $i, $l, "UTF-8");
}
return $ret;
}
return preg_split("http://u", $string, -1, PREG_SPLIT_NO_EMPTY);
}
public function current()
{
return current($this->string);
}
public function next()
{
return next($this->string);
}
public function key()
{
key($this->string);
}
public function valid()
{
if(key($this->string) === null) {
return false;
} else {
return true;
}
}
public function rewind()
{
reset($this->string);
}
}
//client
$string = new String('這個(gè)是什么213jdjlf');
foreach ($string as $k => $v) {
echo $v."\n";
}
這個(gè)設(shè)計(jì)模式實(shí)際業(yè)務(wù)會(huì)很少用到粉捻,在定義自己的數(shù)據(jù)類型時(shí)可能會(huì)用到, PHP里面的數(shù)組已經(jīng)很逆天了斑芜,基本不需要搞自己的數(shù)據(jù)類型肩刃。