本文共 3096 字,大约阅读时间需要 10 分钟。
介绍
可在内部迭代自己的外部迭代器或类的接口。
1 2 3 4 5 6 7 8 9 10 | 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) } |
举个栗子,定义一个迭代器:
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 48 49 50 51 52 53 54 55 56 57 58 59 | class myIerator implements Iterator { protected $position ; //指针 public $arr = []; public function __construct( array $arr ) { $info = date ( 'Y-m-d H:i:s' ) . ' ' . __METHOD__ . ' Line :' . __LINE__ . "\r\n" ; $this ->writeLog( $info ); $this ->arr = $arr ; return $this ; } //获取当前的值 public function current() { $info = date ( 'Y-m-d H:i:s' ) . ' ' . __METHOD__ . ' Line :' . __LINE__ . "\r\n" ; $this ->writeLog( $info ); return $this ->arr[ $this ->position] ?? null; } //将指针移至下一位 public function next() { $info = date ( 'Y-m-d H:i:s' ) . ' ' . __METHOD__ . ' Line :' . __LINE__ . "\r\n" ; $this ->writeLog( $info ); return ++ $this ->position; } //返回当前的指针 public function key() { $info = date ( 'Y-m-d H:i:s' ) . ' ' . __METHOD__ . ' Line :' . __LINE__ . "\r\n" ; $this ->writeLog( $info ); return $this ->position; } //重置指针 public function rewind () { $info = date ( 'Y-m-d H:i:s' ) . ' ' . __METHOD__ . ' Line :' . __LINE__ . "\r\n" ; $this ->writeLog( $info ); $this ->position = 0; } //检查当前是否有效 public function valid() { $info = date ( 'Y-m-d H:i:s' ) . ' ' . __METHOD__ . ' Line :' . __LINE__ . "\r\n" ; $this ->writeLog( $info ); return isset( $this ->arr[ $this ->position]); } private function writeLog(string $info ) { error_log ( $info , 3, './debug.log' ); } } |
1 2 3 4 5 | $zhangsan =[ 'one' , 'two' , 'three' , 'four' ]; $arr = new myIerator( $zhangsan ); foreach ( $arr as $k => $v ) { echo "{$k} => {$v} \r\n" ; } |
打印结果:
0 => one
1 => two 2 => three 3 => four 查看调用日志:2017-11-27 15:56:04 myIerator::__construct Line :16
2017-11-27 15:56:04 myIerator::rewind Line :50 重置指针
2017-11-27 15:56:04 myIerator::valid Line :58 校验是否有效 2017-11-27 15:56:04 myIerator::current Line :25 获取当前指针的值 2017-11-27 15:56:04 myIerator::key Line :41 获取当前指针位置 2017-11-27 15:56:04 myIerator::next Line :33 指针下移一位(进入下一个循环)2017-11-27 15:56:04 myIerator::valid Line :58
2017-11-27 15:56:04 myIerator::current Line :25 2017-11-27 15:56:04 myIerator::key Line :41 2017-11-27 15:56:04 myIerator::next Line :332017-11-27 15:56:04 myIerator::valid Line :58
2017-11-27 15:56:04 myIerator::current Line :25 2017-11-27 15:56:04 myIerator::key Line :41 2017-11-27 15:56:04 myIerator::next Line :332017-11-27 15:56:04 myIerator::valid Line :58
2017-11-27 15:56:04 myIerator::current Line :25 2017-11-27 15:56:04 myIerator::key Line :41 2017-11-27 15:56:04 myIerator::next Line :332017-11-27 15:56:04 myIerator::valid Line :58
//遍历方式二: $arr->rewind(); while ($arr->valid()) { $key = $arr->key(); $value = $arr->current(); echo "{ $key} => { $value} \r\n"; $arr->next(); }