PHP Iterator 接口是一個非常實用的PHP標準庫接口,它能夠在遍歷對象時提供一定的通用特性和一些標準實現。在這篇文章中,我們將深入探討這個接口,了解如何使用它,以及它的內部機制是如何工作的。
PHP Iterator 接口從一個概念上來看非常簡單:它僅僅定義了幾個方法,包括 current()、next()、key()、rewind() 和 valid()。我們可以通過這些方法,來實現迭代對象的遍歷,比如遍歷一個數組中的每一個元素。
class MyIterator implements Iterator {
private $var = array();
public function __construct($array) {
if (is_array($array)) {
$this->var = $array;
}
}
public function rewind() {
reset($this->var);
}
public function current() {
$var = current($this->var);
return $var;
}
public function key() {
$var = key($this->var);
return $var;
}
public function next() {
$var = next($this->var);
return $var;
}
public function valid() {
$key = key($this->var);
$var = ($key !== NULL && $key !== FALSE);
return $var;
}
}
在上面的例子中,我們創建了一個實現了 Iterator 接口的類 MyIterator。該類包含一個私有變量 $var,它被賦值為一個數組。我們在類里實現了 Iterator 接口中定義的方法,以此來定義該對象在迭代過程中所表現的行為。
例如,在 rewind() 方法中我們使用了PHP內置函數reset(),將數組指針重置到第一個元素。在 current() 方法中,我們使用了函數current(),該函數返回指針當前所處位置上的元素的值。
值得注意的是,Iterator 接口并沒有定義任何可變方法(即不會改變被遍歷對象自身狀態的方法),因此迭代器對象應該被視為只讀對象。缺省情況下,如果你嘗試在這樣的迭代器對象上調用 push() 或 delete()等可變方法,你會得到一個 PHP 錯誤。
還可以為已有的數組添加迭代器對象,將數組轉換為一個迭代器對象,通過使用庫函數iterator_count(),可以以同一種方式操作數組。假設我們有一個數組,其下標從0到9,每個元素的值是1倍到10倍,現在,我們想要用迭代器對象來遍歷這個數組:
$array = array(null, true, false, -47, 'abc', 3.14);
$it = new ArrayIterator($array);
echo "total items: " . iterator_count($it) . "\n";
foreach($it as $key =>$value) {
printf("key=%s; value=%s\n", $key, $value);
}
ArrayIterator 為標準庫中定義的一個實現 Iterator 接口的類。在上述例子中我們產生了一個在實現了 Iterator 接口的新對象中工作的 ArrayIterator 對象,然后使用 foreach 循環遍歷了該對象的每一個元素。
最后,PHP Iterator 接口是一個非常好的PHP標準庫接口,能幫助我們優雅的遍歷數據結構中的元素。雖然該接口顯得有些簡單和基礎,但是通過嘗試使用 Iterator 來迭代不同類型的數據結構,你會發現,它確實是一個非常實用、而且易于學習的接口。