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("//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);
}
}
$string = new String('这个是什么213jdjlf');
foreach ($string as $k => $v) {
echo $v."\n";
}
https://segmentfault.com/q/1010000010830185
迭代器是一种更高级的工具。foreach是简单的循环语法。虽然功能上看起来相似。但迭代器是工具,这是二者性质上的不同,所以迭代器有更丰富的功能特性,还可以自定义具体的实现。特别是在内存占用上,迭代器是按需读取数据,foreach是一次性载入数据。PHP里面PDO,SimpleXML里面都有迭代器的具体实现,更完整的全部在SPL扩展部分。