Skip to main content

什麼是 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.phpbuild() 方法大致如下。
Util::getParameterClassName() 是從 $parameter->getType() 結果取出型別名稱字串的工具。將 ReflectionParameter::getType() 回傳的 ReflectionNamedType 包裝為易於處理的形式。

PHP Attributes 的讀取

PHP 8.0 以後,可以使用 Reflection API 取得類別、方法、屬性上的 attribute。Laravel 便是利用此機制處理 Queue attribute 或 Eloquent attribute。
關於 PHP Attributes 及其於 Laravel 的整合,也請一併參考 PHP Attributes

讀取 attribute 的基本模式

Laravel 讀取 Queue attribute 的機制(簡略版)

讀取方法上的 attribute

套件開發的活用範例

檢查類別實作的介面

於套件中可動態確認類別是否實作特定介面。

Metadata 取得 — 以 attribute 自動註冊路由

結合 attribute 與 Reflection 自動蒐集路由的模式。

動態方法呼叫 — 方法注入

Laravel 的 call() 方法使用 Reflection 自動解析引數。以下為在套件中實作相同機制的範例。

蒐集屬性的預設值

以 Reflection 取得設定類別預設值的模式。

效能考量

Reflection API 每次都會 parse 類別資訊,因此有成本。於正式環境程式碼中快取結果為最佳實踐。
PHP 的 OPcache 不會快取 Reflection 的結果。若要在迴圈中檢查大量類別,請考慮自訂快取。不過 Laravel 容器本身於同一請求內也會重複使用 ReflectionClass 實例。

下一步

PHP Attributes

學習透過 ReflectionClass::getAttributes() 讀取的 PHP Attributes 詳細內容。

套件開發

學習活用 Reflection API 的 Laravel 套件開發方式。
最後修改於 2026年8月2日