上一篇《手寫PHP API框架之Composer的安裝使用(二)》文章中我們介紹了Composer的安裝使用,這一文我們來介紹一下有關反射的概念介紹。
反射,直覺理解就是根據到達地找到出發地和來源。反射指在PHP運行狀態中,擴展分析PHP程序,導出或提出關於類別、方法、屬性、參數等的詳細信息,包括註釋。這種動態擷取資訊以及動態呼叫物件方法的功能稱為反射API。
不妨先來看一個demo:
<?php function p($msg, $var) { echo($msg.":".print_r($var, true)).PHP_EOL.PHP_EOL; } class Demo { private $id; protected $name; public $skills = []; public function __construct($id, $name, $skills = []) { $this->id = $id; $this->name = $name; $this->skills = $skills; } public function getName() { return $this->name; } public function getSkill() { p('skill', $this->skills); } } $ref = new ReflectionClass('Demo'); if ($ref->isInstantiable()) { p('检查类是否可实例化isInstantiable', null); } $constructor = $ref->getConstructor(); p('获取构造函数getConstructor', $constructor); $parameters = $constructor->getParameters(); foreach ($parameters as $param) { p('获取参数getParameters', $param); } if ($ref->hasProperty('name')) { $attr = $ref->getProperty('name'); p('获取属性getProperty', $attr); } $attributes = $ref->getProperties(); foreach ($attributes as $row) { p('获取属性列表getProperties', $row->getName()); } if ($ref->hasMethod('getSkill')) { $method = $ref->getMethod('getSkill'); p('获取方法getMethod', $method); } $methods = $ref->getMethods(); foreach ($methods as $row) { p('获取方法列表getMethods', $row->getName()); } $instance = $ref->newInstanceArgs([1, 'sai', ['php', 'js']]); p('newInstanceArgs', $instance);
輸出:
➜ php git:(main) php reflect.php 检查类是否可实例化isInstantiable: 获取构造函数getConstructor:ReflectionMethod Object ( [name] => __construct [class] => Demo ) 获取参数getParameters:ReflectionParameter Object ( [name] => id ) 获取参数getParameters:ReflectionParameter Object ( [name] => name ) 获取参数getParameters:ReflectionParameter Object ( [name] => skills ) 获取属性getProperty:ReflectionProperty Object ( [name] => name [class] => Demo ) 获取属性列表getProperties:id 获取属性列表getProperties:name 获取属性列表getProperties:skills 获取方法getMethod:ReflectionMethod Object ( [name] => getSkill [class] => Demo ) 获取方法列表getMethods:__construct 获取方法列表getMethods:getName 获取方法列表getMethods:getSkill newInstanceArgs:Demo Object ( [id:Demo:private] => 1 [name:protected] => sai [skills] => Array ( [0] => php [1] => js ) )
demo裡面就有使用了ReflectionClass類,當然ReflectionClass類別不只這些方法。
更多方法
ReflectionClass類別還有更多方法:
方法 | 說明 |
---|---|
#ReflectionClass::__construct | 初始化ReflectionClass類別 |
ReflectionClass::export | 匯出一個類別 |
ReflectionClass::getConstant | 取得定義過的一個常數 |
ReflectionClass::getConstants | #取得一組常數 |
ReflectionClass::getConstructor | 取得類別的建構子 |
ReflectionClass::getDefaultProperties | 取得預設屬性 |
取得文件註解 | |
取得最後一行的行數 | |
根據已定義的類別取得所在擴充功能的ReflectionExtension 物件 | |
取得定義的類別所在的擴充功能的名稱 | |
取得定義類別的檔案名稱 | |
#取得介面(interface)名稱 | |
使用介面 | |
#取得一個類別方法的ReflectionMethod。 | |
ReflectionClass::getMethods | 取得方法的陣列 |
ReflectionClass::getModifiers | #取得類的修飾符 |
ReflectionClass::getName | 取得類別名稱 |
ReflectionClass::getNamespaceName | #取得命名空間的名稱 |
ReflectionClass::getParentClass | #取得父類別 |
ReflectionClass::getProperties | 取得一組屬性 |
ReflectionClass::getProperty | 取得類別的一個屬性的ReflectionProperty |
##ReflectionClass:: getReflectionConstant | Gets a ReflectionClassConstant for a class's constant |
ReflectionClass::getReflectionConstants | Gets class constants |
ReflectionClass::getShortName | 取得短名 |
#ReflectionClass::getStartLine | ##以取得起始行號|
ReflectionClass::getStaticProperties | |
ReflectionClass::getStaticPropertyValue | ##取得靜態(static)屬性的值|
ReflectionClass::getTraitAliases | 傳回trait 別名的一個陣列 |
ReflectionClass::getTraitNames | #傳回這個類別所使用traits 的名稱的陣列 |
ReflectionClass::getTraits | 傳回這個類別所使用的traits 陣列 |
#ReflectionClass::hasConstant | 檢查常數是否已經定義 |
#ReflectionClass::hasMethod | ##檢查方法是否已定義 |
#ReflectionClass::hasProperty | 檢查屬性是否已定義 |
#ReflectionClass::implementsInterface | 介面的實作 |
ReflectionClass::inNamespace | 檢查是否位於命名空間中 |
ReflectionClass::isAbstract | 檢查類別是否為抽象類別(abstract) |
ReflectionClass::isAnonymous | 檢查類別是否為匿名類別 |
ReflectionClass::isCloneable | 傳回了一個類別是否可複製 |
ReflectionClass::isFinal | 檢查類別是否宣告為final |
檢查類別的實例 | |
檢查類別是否可實例化 | |
檢查類別是否是一個介面(interface) | |
檢查類別是否由擴充或核心在內部定義 | |
Check whether this class is iterable | |
檢查是否可迭代(iterateable) | |
檢查是否為一個子類別 | |
傳回了是否為一個trait | |
檢查是否由使用者定義的 | |
從指定的參數建立一個新的類別實例 | |
從給定的參數建立一個新的類別實例。 | |
#建立一個新的類別實例而不呼叫它的建構子 |
除去強大的ReflectionClass,還有Reflection、ReflectionClassConstant 、ReflectionMethod 、ReflectionFunctionAbstract等等。建議查看手冊:
#反射的實際應用
反射的優點
反射的缺點
這一節是比較獨立的,在後面的章節我們會使用它。
推薦學習:《
PHP影片教學以上是手寫PHP API框架(三)之反射介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!