什麼是 PHP Reflection API
PHP Reflection API 是 PHP 內建功能,可於執行時取得並檢查類別、方法、屬性、函式、參數等 metadata。可調查類別的建構函式接收哪些引數、方法上加註了哪些 attribute,且無需直接改寫原始碼。 Laravel 於Illuminate/Container/Container.php 內部大量使用 Reflection API,實現 DI 容器的自動解析、PHP Attributes 的讀取、方法注入等。
主要類別
ReflectionClass — 取得類別資訊
ReflectionParameter — 檢查建構函式引數
Laravel Container 與 Reflection API
Laravel 的 IoC 容器使用 Reflection API 實現建構函式注入(自動相依性解析)。讓我們理解app()->make(SomeClass::class) 或依賴注入運作的機制。
Container 的 build() 方法(簡略版)
實際 Container.php 的 build() 方法大致如下。
Util::getParameterClassName() 是從 $parameter->getType() 結果取出型別名稱字串的工具。將 ReflectionParameter::getType() 回傳的 ReflectionNamedType 包裝為易於處理的形式。PHP Attributes 的讀取
PHP 8.0 以後,可以使用 Reflection API 取得類別、方法、屬性上的 attribute。Laravel 便是利用此機制處理 Queue attribute 或 Eloquent attribute。讀取 attribute 的基本模式
Laravel 讀取 Queue attribute 的機制(簡略版)
讀取方法上的 attribute
套件開發的活用範例
檢查類別實作的介面
於套件中可動態確認類別是否實作特定介面。Metadata 取得 — 以 attribute 自動註冊路由
結合 attribute 與 Reflection 自動蒐集路由的模式。動態方法呼叫 — 方法注入
Laravel 的call() 方法使用 Reflection 自動解析引數。以下為在套件中實作相同機制的範例。
蒐集屬性的預設值
以 Reflection 取得設定類別預設值的模式。效能考量
Reflection API 每次都會 parse 類別資訊,因此有成本。於正式環境程式碼中快取結果為最佳實踐。下一步
PHP Attributes
學習透過 ReflectionClass::getAttributes() 讀取的 PHP Attributes 詳細內容。
套件開發
學習活用 Reflection API 的 Laravel 套件開發方式。