PHP预定义接口之Iterator用法示例

本文实例讲述了PHP预定义接口之Iterator用法。分享给大家供大家参考,具体如下:

Iterator(迭代器)接口

可在内部迭代自己的外部迭代器或类的接口。

接口摘要

  1. Iterator extends Traversable {
  2. /* 方法 */
  3. abstract public current ( void ) : mixed
  4. abstract public key ( void ) : scalar
  5. abstract public next ( void ) : void
  6. abstract public rewind ( void ) : void
  7. abstract public valid ( void ) : bool
  8. }

例:

  1. <?php
  2. class myIterator implements Iterator
  3. {
  4. private $position = 0;
  5. private $array = array(
  6. 'first_element',
  7. 'second_element',
  8. 'last_element',
  9. );
  10. /**
  11. * 重置键的位置
  12. */
  13. public function rewind(): void
  14. {
  15. var_dump(__METHOD__);
  16. $this->position = 0;
  17. }
  18. /**
  19. * 返回当前元素
  20. */
  21. public function current()
  22. {
  23. var_dump(__METHOD__);
  24. return $this->array[$this->position];
  25. }
  26. /**
  27. * 返回当前元素的键
  28. * @return int
  29. */
  30. public function key(): int
  31. {
  32. var_dump(__METHOD__);
  33. return $this->position;
  34. }
  35. /**
  36. * 将键移动到下一位
  37. */
  38. public function next(): void
  39. {
  40. var_dump(__METHOD__);
  41. ++$this->position;
  42. }
  43. /**
  44. * 判断键所在位置的元素是否存在
  45. * @return bool
  46. */
  47. public function valid(): bool
  48. {
  49. var_dump(__METHOD__);
  50. return isset($this->array[$this->position]);
  51. }
  52. }
  53. $it = new myIterator;
  54. foreach ($it as $key => $value) {
  55. var_dump($key, $value);
  56. echo "\n";
  57. }

输出结果:

  1. string 'myIterator::rewind' (length=18)
  2. string 'myIterator::valid' (length=17)
  3. string 'myIterator::current' (length=19)
  4. string 'myIterator::key' (length=15)
  5. int 0
  6. string 'first_element' (length=13)
  7. string 'myIterator::next' (length=16)
  8. string 'myIterator::valid' (length=17)
  9. string 'myIterator::current' (length=19)
  10. string 'myIterator::key' (length=15)
  11. int 1
  12. string 'second_element' (length=14)
  13. string 'myIterator::next' (length=16)
  14. string 'myIterator::valid' (length=17)
  15. string 'myIterator::current' (length=19)
  16. string 'myIterator::key' (length=15)
  17. int 2
  18. string 'last_element' (length=12)
  19. string 'myIterator::next' (length=16)
  20. string 'myIterator::valid' (length=17)

由结果可知,当类实现了Iterator接口,实现改类实例数据集的时候首先会将数据集的键重置,然后逐步后移,每次都会进行然后返回当前元素以及当前键。