我今天正在細讀手冊並注意到various iterators。對我來說,似乎他們都毫無意義;我沒有看到使用它們的理由,除非你更喜歡它們的語法,或者不知道如何編寫遞歸函數。是否有任何理由在PHP中使用內置迭代器而不是編寫循環或製作遞歸方法?我只是在尋找事實反應,而不是主觀偏好(即:我不在乎你是否認爲它更「可讀」或「更面向對象」,我想知道它們是否更快,提供滾動自己時無法實現的功能等)。PHP - 使用迭代器的原因?
回答
我相信主要原因是多功能性。他們不會讓事情更具可讀性,您可以通過簡單的foreach
完成大部分spl iterators。
但迭代器可以作爲一種可以傳遞的壓縮循環或循環源。您可以擁有更多不同的數據源,而不僅僅是一個列表/數組。真正的好處是你可以將它們進行包裝或堆疊以進行聚合。
命名有點不明顯,但我想你可以使用AppendIterator
來例如結合一個靜態文件名列表和DirectoryIterator
的結果。或以其他方式將其包裝在LimitIterator
中,而不是將其硬編碼爲for
條件。所有這些都是非常基本的功能,可以在foreach中手動完成。但至少RegexIterator
和FilterIterator
似乎適合降低一些複雜性。
但最終它確實是一種文體選擇。如果你有自定義對象遍歷某些東西(例如一個VFS對象,它可以指向真實文件或數據庫條目),這將是最有意義的。但即使如此,你可以只是iterator_to_array
轉換這樣一個列表,並使用正常的foreach
-over-array。
唯一的情況是,如果數據源的大小沒有限制,則首選迭代器是非常必要的。用於foreach
的未摺疊數組可以消耗比可以逐元素檢索的迭代器更多的內存。
一個簡單的例子:實現一個可以像數組一樣訪問和遍歷的對象。 SimpleXML是一個很好的例子,可以通過它實現強大的行爲。
要做到這一點,你可以implement
定義方法public current()
,public key()
,public next()
,public rewind()
和public valid()
的Iterator
interface。
或者你可以簡單implement
替代IteratorAggregate
interface定義一個方法public getIterator()
它只是返回要暴露內部數據的迭代器。
一定要看看上面的接口的例子,你會看到優勢。
該問題可以有各種各樣的答案,但適當的答案可能可以概括爲:迭代器可用於迭代比簡單數組更復雜的任何東西。
一個例子是某種ORM或查詢生成器。假設我們有一個 - 用它可能看起來像:
$friends = new Model_Friend();
$friends = $people->where('age','>',30)->where('gender','=','female');
foreach ($friends as $friend) {
echo $friend->name;
}
迭代器一樣快,因爲別的,而是用更簡單的界面,或許更verbage把它包起來。然而,主要的優點是沒有什麼你現在可能需要,但如何擴展它們來處理你未來的問題(他們會來!),這就是我們老男孩所說的「拯救你未來的屁股」。 :)
迭代器的主要優點是它們抽象了迭代的概念。這意味着任何數據提供者都可以通過相同的接口使用。而這也正是在那裏,你可以把他們的優勢:
- 懶惰
- 減少內存使用
- 組成
懶惰
與數據提供商,該數據僅取當你真的需要它時(例如,當你迭代時)。
減少內存使用
迭代鼓勵你反覆處理,而不是在內存中緩存數據它。雖然沒有迭代器可以做到這一點,但它們提供的抽象隱藏了實現,使得它們非常易於使用。
組成
什麼馬里奧說。
約扎斯Kaziukėnas最近寫的,他如何使用迭代器來模擬懶評價在PHP blog post。它詳細介紹了我提到的一些事情。
- 1. 原因在不同的迭代器
- 2. 使用PHP迭代器
- 3. 任何原因PHP不會通過引用來迭代數組?
- 4. 原因Scala的Map.unzip返送(可迭代,可迭代)
- 5. memset的原因「矢量迭代器不兼容」的錯誤
- 6. 迭代器訪問衝突的原因和解決方案
- 7. PHP迭代器像mysql迭代器?
- 8. 使用迭代器
- 9. PHP迭代器時,迭代結束
- 10. 如何迭代使用迭代器
- 11. 推迭代迭代器混合使用
- 12. 使用不安全代碼的原因
- 13. 使用(void)someInt的原因;在代碼
- 14. 如何將Peekable迭代器轉換回原始迭代器?
- 15. 應該使用迭代器原始類型還是不使用?
- 16. 的Java迭代器的原始類型
- 17. 迭代器的迭代器
- 18. 的Java迭代器使用
- 19. 的LinkedList使用迭代器
- 20. 因子迭代java
- 21. stl ::與原始指針的迭代器
- 22. 使用代碼點火器的原因`2014`錯誤
- 23. 作業:使用私有迭代器類的迭代器方法
- 24. 迭代中跳過了一些奇怪的原因
- 25. 不使用GROUP_CONCAT的原因?
- 26. 排序PHP迭代器
- 27. simplexml解析器php迭代
- 28. PHP,迭代器接口
- 29. PHP Array迭代器到DIV
- 30. LinkedHashSet迭代器進入無限循環沒有明顯的原因
「更多面向對象」不是主觀意見;它深入研究問題的功能集。如果你處理對象,以面向對象的方式處理它們並不是主觀的。 – AlexanderJohannesen 2011-06-06 02:05:30
我認爲在這種情況下,「更多面向對象」是一種主觀意見,因爲迭代器實現的實現並不比定製實現更「面向對象」。它們不再是面向對象的解決方案。 – mrjminer 2011-06-06 02:20:38
這是一個奇怪的評論,因爲一些迭代器對傳統方法根本不起作用的特定對象進行操作(這是非常重要的一點)。除非將對象轉換爲數組,否則不能將對象視爲數組,除非經常這是不可能的;任何非樹形結構都會讓你頭痛不已。如果你依賴於某些關係的語義來遍歷一個圖,沒有迭代器這是不可能的,但通常是非常微不足道的。所以。不,不是非主觀的,除非你是伏爾泰並鑽研存在主義。 :) – AlexanderJohannesen 2011-06-06 02:28:52