標籤:php迭代器的內部執行過程
下面我們來瞭解如何?一個自訂的迭代器,然後再開始慢慢理解迭代器的內部工作原理。先來看一個官方的例子:
<?phpclass myIterator implements Iterator { private $position = 0; private $array = array( "first_element", "second_element", "last_element", ); public function __construct() { $this->position = 0; } function rewind() { var_dump(__METHOD__); $this->position = 0; } function current() { var_dump(__METHOD__); return $this->array[$this->position]; } function key() { var_dump(__METHOD__); return $this->position; } function next() { var_dump(__METHOD__); ++$this->position; } function valid() { var_dump(__METHOD__); return isset($this->array[$this->position]); }}$it = new myIterator;foreach($it as $key => $value) {echo ‘輸出索引值:‘; var_dump($key, $value);//echo $key; echo "\n";}
程式運行輸出:
string(18) "myIterator::rewind"string(17) "myIterator::valid"string(19) "myIterator::current"string(15) "myIterator::key"輸出索引值:int(0)string(13) "first_element"string(16) "myIterator::next"string(17) "myIterator::valid"string(19) "myIterator::current"string(15) "myIterator::key"輸出索引值:int(1)string(14) "second_element"string(16) "myIterator::next"string(17) "myIterator::valid"string(19) "myIterator::current"string(15) "myIterator::key"輸出索引值:int(2)string(12) "last_element"string(16) "myIterator::next"string(17) "myIterator::valid"
一般的迭代器內部需要下面的方法:
- Iterator::current — Return the current element 返回當前元素
- Iterator::key — Return the key of the current element 返回當前元素的鍵
- Iterator::next — Move forward to next element 移向下一個元素
- Iterator::rewind — Rewind the Iterator to the first element 重新回到第一個元素
- Iterator::valid — Checks if current position is valid 檢查當前位置的有效性
如果不是很清楚迭代器的內容工作流程,可以查看下面的迭代器對數組的遍曆過程:
<?php/*** @author [email protected]*/class MyIterator implements Iterator{ private $var = array(); public function __construct($array) { if (is_array($array)) { $this->var = $array; } } public function rewind() { echo "倒回第一個元素\n"; reset($this->var); } public function current() { $var = current($this->var); echo "當前元素: $var\n"; return $var; } public function key() { $var = key($this->var); echo "當前元素的鍵: $var\n"; return $var; } public function next() { $var = next($this->var); echo "移向下一個元素: $var\n"; return $var; } public function valid() { $var = $this->current() !== false; echo "檢查有效性: {$var}\n"; return $var; }}$values = array(1,2,3);$it = new MyIterator($values);foreach ($it as $k => $v) { print "此時索引值對 -- key $k: value $v\n\n";}
程式運行結果:
倒回第一個元素當前元素: 1檢查有效性: 1當前元素: 1當前元素的鍵: 0此時索引值對 -- key 0: value 1移向下一個元素: 2當前元素: 2檢查有效性: 1當前元素: 2當前元素的鍵: 1此時索引值對 -- key 1: value 2移向下一個元素: 3當前元素: 3檢查有效性: 1當前元素: 3當前元素的鍵: 2此時索引值對 -- key 2: value 3移向下一個元素: 當前元素: 檢查有效性:
現在就很清晰了吧?