核心差異
| 特性 | ReflectionClass | ReflectionObject |
| 反射對象 | 類別定義(靜態結構) | 物件實例(執行時狀態) |
| 建構參數 | 類別名稱字串或物件 | 物件實例 |
| 可見屬性 | 宣告於類別中的屬性 | 包含動態新增的屬性 |
| 可見方法 | 類別定義的所有方法 | 同 ReflectionClass |
| 靜態屬性值 | 類別預設值 | 當前實際值 |
經典案例:動態屬性
<?php
class Test {
private $declared = 'declared';
public function __construct() {
$this->dynamic = 'dynamic'; // 執行時新增
}
}
$obj = new Test();
// ReflectionClass:只看類別定義
$rc = new ReflectionClass($obj);
$props = $rc->getDefaultProperties();
print_r($props);
// 輸出:Array ( [declared] => ) — 只有宣告的屬性,$dynamic 消失
// ReflectionObject:看實例實際狀態
$ro = new ReflectionObject($obj);
$props = $ro->getProperties();
print_r($props);
// 輸出:包含 declared 和 dynamic 兩個屬性
方法比較
<?php
class Service {
public $config = [];
public function __construct(array $config) {
$this->config = $config;
}
}
$service = new Service(['debug' => true]);
// 取得屬性值
$rc = new ReflectionClass(Service::class);
$ro = new ReflectionObject($service);
$prop = $rc->getProperty('config');
$prop->setAccessible(true);
echo "Class default: "; var_dump($prop->getValue()); // null(預設值)
echo "Object value: "; var_dump($prop->getValue($service)); // ['debug' => true]
// ReflectionObject 直接取值
$propObj = $ro->getProperty('config');
$propObj->setAccessible(true);
echo "Object via RO: "; var_dump($propObj->getValue($service)); // 同樣結果
實務應用場景
- ReflectionClass:框架掃描註解、依賴注入容器分析建構函式參數、生成 API 文件
- ReflectionObject:序列化/反序列化、物件狀態快照、除錯工具輸出實例完整狀態、動態屬性檢測
常用方法速查
<?php
$rc = new ReflectionClass(User::class);
$ro = new ReflectionObject($user);
$rc->getName(); // 類別名稱
$rc->getNamespaceName(); // 命名空間
$rc->getParentClass(); // 父類別 ReflectionClass
$rc->getInterfaces(); // 實作介面陣列
$rc->getTraits(); // 使用 Trait 陣列
$rc->getConstants(); // 常數
$rc->getProperties(); // 所有屬性(含繼承)
$rc->getMethods(); // 所有方法
$rc->getDocComment(); // 類別文件註解
$rc->isAbstract(); // 是否抽象
$rc->isFinal(); // 是否 final
$rc->isInterface(); // 是否介面
$rc->isTrait(); // 是否 Trait
$rc->newInstance($args); // 實例化(等同 new)
$rc->newInstanceWithoutConstructor(); // 不呼叫建構函式實例化
效能注意
- 反射操作較慢,避免在熱路徑(如每請求數百次)使用
- 生產環境建議快取反射結果(如 Doctrine Annotations 快取)
- PHP 8.0+ 新增
ReflectionAttribute 原生支援屬性註解,效能優於文件註解解析