首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 反射類 ReflectionClass vs ReflectionObject:靜態結構 vs 實例狀態

     編輯:PHP 綜合知識

核心差異

特性ReflectionClassReflectionObject
反射對象類別定義(靜態結構)物件實例(執行時狀態)
建構參數類別名稱字串或物件物件實例
可見屬性宣告於類別中的屬性包含動態新增的屬性
可見方法類別定義的所有方法同 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 原生支援屬性註解,效能優於文件註解解析
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved