本頁的目的
本頁不是介紹collect() 的用法,而是提供閱讀 Laravel 本體實作原始碼的地圖。
適合已熟悉 Collection 方法清單、想進一步理解「為何採此設計」的讀者。
歷史沿革
Collection 的結構在導入LazyCollection 時經過大幅整理。
Laravel 5.8 以前
Illuminate\Support\CollectionIlluminate\Database\Eloquent\Collection(繼承Collection)
LazyCollection、Enumerable、EnumeratesValues。
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 追蹤共通方法
map、filter、reduce 等大量共通邏輯皆在此。
之後只看 Collection 與 LazyCollection 之間的差異即可,減少略讀。
3. 比較 Collection 與 LazyCollection 的差異
Collection:持有陣列並立即求值LazyCollection:使用Generator延遲求值
4. 最後閱讀 Eloquent\Collection
集中在 find、load、modelKeys 等針對模型集合的擴充。
於理解基底 Collection 後再閱讀,其意圖會更易懂。