2013-02-03 149 views
0

我已經從SPL迭代器擴展和實現了。
但是,如果我想使用它,我應該在foreach上使用它。
我想在一個while像這樣使用它:PHP迭代器像mysql迭代器?

$news = new testClass(); 

while($row = $news) 
    echo $row["name"]; 

這將創建一個無限循環!
但與foreach,它工作正常!

這裏是我最想去類:

class testClass implements \Iterator 

哪裏錯了嗎?

+2

使用'while'圈更是一個C風格的迭代器比你想的迭代器。你需要實現['Iterator'方法](http://php.net/manual/en/class.iterator.php),然後應該使用foreach循環。 –

+1

您是否試圖迭代'$ news'對象中的公共屬性? – halfer

回答

1

對於這種類型的「標準」問題,使用SPL類的拳頭,bravo。我經常看到沒有經驗的/拙劣的開發人員(甚至是那些根本沒有想到的好開發人員)在這些情況下重新發明輪子。

您錯過了一些關於iterator接口實施的非常重要的細節。

有關更多信息,請參閱PHP:Iterator - Manual以及參考實施。

首先,您需要實現,rewind, current, key, next, and valid函數。參考實現是這樣的:

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"; 
} 
+0

+1!感謝您的回答。我已經有這種風格。如果你回到我的問題上,我說這是我班的頂尖! –

+0

我發現了這一點,但它並沒有告訴我你已經實現了必要的功能。然後,您的問題的答案將覆蓋示例代碼的第二部分(使用foreach而不是for)。 – DavidDraughn

1

foreach是語言結構,通過所有元素進行迭代。 while執行代碼塊直到給定的條件爲真。爲了使它工作,你必須使用你自己的函數來檢查有效密鑰並返回當前元素。

+0

+1爲邏輯 –

0

最後,我創建了一個簡單的例子:

<?php 

/** 
* @author Soroush Khosravi 
* @copyright 2013 
*/ 
class _Iterator 
{ 
    private $array; 

    public function setArray(array $data) 
    { 
     $this->array = $data; 
    } 

    public function reader() 
    { 
     if (is_null($this->array)) 
      return false; 

     $elem = array_shift($this->array); 
     if (count ($this->array) > 0) 
      return $elem; 
     return false; 
    } 
} 

Class child extends _Iterator 
{ 
    function execute() 
    { 
     $this->setArray(array(1,2,3,4,5,6)); 
     return $this; 
    } 
} 
$obj = new child; 
$obj = $obj->execute(); 
while($row = $obj->reader()) 
    echo $row; 

?> 
+0

無需回答自己的問題。並且請記住,這會導致數組中的任何虛假值失效(例如,嘗試在3和4之間設置0),所以更好地使用'foreach'。 –

+0

@ dev-null-dweller我不記得我問過'foreach'!我正在尋找這種形式,現在這是我的答案,我認爲這是真的:) –

+1

我只是說,你可能有這個構造的一些價值的麻煩,就這樣。 –