2008-12-11 57 views
4

我試圖重構一個大的,舊的項目一兩件事我注意到是一系列不同的迭代器實現的:我應該在PHP中使用Iterator的哪個實現,爲什麼?

while($iterator->moveNext()) { 
    $item = $iterator->current(); 
    // do something with $item; 
} 

for($iterator = getIterator(), $iterator->HasNext()) { 
    $item = $iterator->Next(); 
    // do something with $item 
} 

while($item = $iterator->fetch()) { 
    // do something with item 
} 

甚至StandardPHPLibrary (SPL)迭代器允許

foreach($iterator as $item) { 
    // do something with $item 
} 

有所以很多不同的迭代器(用不同的方法來循環集合)看起來像一個強大的代碼異味,我傾向於將所有事情重構爲SPL。 Iterator的這些實現是否具有令人信服的優勢,還是純粹是個人品味的問題?

回答

9

SPL版本絕對是您的選擇。它不僅是最容易閱讀的,而且現在也是PHP的一部分,所以更多人會熟悉它。

其他人沒有什麼「錯誤」,但正如您所說的,在一個項目中使用所有這些不同版本並不能幫助任何人。

1

Imo,簡單地利用一個或多個SPL庫作爲接口在前端使用時往往不太難看。但是,實現背後的支持可能會有點難以理解。例如,我編寫了一個有效地迭代數據庫結果集的迭代器,以便從未請求的結果永遠不會從請求指針中獲取,並且如果項過早地獲取(IE:$ obj [5]),它會將所有需要的結果都放入內部緩衝區中。

表現的很出色,你只是祈禱代碼,使幕後的神奇,因爲它混淆了人,當他們看到你使用的東西,看起來像一個數組永遠不會失敗,而且它可以失敗:)

「神奇」

魔法讓人們被燒死。所以仔細,明智地使用它,可能會使它明白它是如何工作的。

我個人的偏好是爲

for($object as $i => $v) 

符號來表示,通常是比較一致的和可預測的。

for($dbresult->iterator() as $i => $v){ 

} 

樣式表示法在功能上是相同的,但至少您猜測它在表面上的工作原理至少如此。

相關問題