分析:想一下,若是把集合對象和對集合對象的操做放在一塊兒,當咱們想換一種方式遍歷集合對象中元素時,就須要修改集合對象了,違背「單一職責原則」,而迭代器模式將數據結構和數據結構的算法分離開,二者可獨立發展。php
優勢:算法
缺點:數組
具體接口:數據結構
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 bool valid ( void ) }
簡單的foreach迭代器實現函數
<?php class myIterator implements Iterator { private $position = 0; private $array = array( "firstelement", "secondelement", "lastelement", ); 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) { var_dump($key, $value); echo "\n"; } ?>
PHP生成器(generator)是PHP5.5.0引入的功能,與標準的PHP迭代器不一樣,PHP生成器不要求類實現Iterator接口,從而減輕了類的負擔,生成器會根據需求計算併產出要迭代的值,這對性能有重大的影響試想一下假如標準的PHP迭代器常常在內存中執行迭代操做者要預先計算出數據集性能低下;若是要使用特定的的方式對計算大量數據,對性能的影響更甚。此時咱們能夠使用生成器,即時計算產出後續值不佔用寶貴的內存資源。
優勢:性能
缺點:this
建立生成器:scala
<?php function myGenerator(){ yield 'a'; yield 'b'; yield 'c'; }
<?php function makeRange($length){ for($i = 0; $i<$length; $i++){ yield $i; } } foreach(makeRange(1000000) as $i){ echo $i,PHP_EOL; }
如上所示:
當$length 很大時(上百萬),並且你同時沒有使用生成器的話,那麼就要預先爲一個由一百萬上一千五個整數組成的數組分配內存。而PHP生成器能實現相同的操做,不過一次只會爲一個整數分配內存code