Skip to main content

本頁的目的

本頁不是介紹 collect() 的用法,而是提供閱讀 Laravel 本體實作原始碼的地圖。 適合已熟悉 Collection 方法清單、想進一步理解「為何採此設計」的讀者。

歷史沿革

Collection 的結構在導入 LazyCollection 時經過大幅整理。

Laravel 5.8 以前

  • Illuminate\Support\Collection
  • Illuminate\Database\Eloquent\Collection(繼承 Collection
此時尚不存在 LazyCollectionEnumerableEnumeratesValues

Laravel 6.0 的變更

隨著加入 LazyCollection,共通 API 被分離為 Enumerable(介面)與 EnumeratesValues(trait)的結構。

現在的整體結構(Laravel 13)

參照:laravel/framework v13.x
目前實體檔案路徑為 src/Illuminate/Collections/*,但命名空間仍保留為 Illuminate\\Support。閱讀原始碼時請將「路徑」與「namespace」分開來確認。

PHPDoc 與 PHPStan 風格的 Generics

PHP 本身沒有 Generics。 即便如此,Collection 相關程式碼透過 PHPDoc 表達了強型別資訊。 主要目的有二:
  • 讓 IDE 補完精準
  • 提升 PHPStan / Larastan 等靜態分析的精度

常見的寫法

於 Eloquent Collection 的樣貌

TValue 被具體化為 TModel,因此 map()filter() 等的型別推斷可強化為 Eloquent 模型導向。

閱讀實作時的順序

1. 從 Enumerable 入手

先掌握「所提供的契約為何」。 掌握此處的方法清單後,後續閱讀實作會更迅速。

2. 沿著 EnumeratesValues 追蹤共通方法

mapfilterreduce 等大量共通邏輯皆在此。 之後只看 CollectionLazyCollection 之間的差異即可,減少略讀。

3. 比較 CollectionLazyCollection 的差異

  • Collection:持有陣列並立即求值
  • LazyCollection:使用 Generator 延遲求值
即使是同名方法,求值時機與記憶體特性也不同。

4. 最後閱讀 Eloquent\Collection

集中在 findloadmodelKeys 等針對模型集合的擴充。 於理解基底 Collection 後再閱讀,其意圖會更易懂。
深入探討單一方法時,依 Enumerable 的宣告 → EnumeratesValues 的本體 → Collection / LazyCollection 是否覆寫的順序追蹤,就不會迷路。

相關頁面

最後修改於 2026年8月2日