一、什麼是反射?
它是指在PHP運行狀態中,擴展分析PHP程序,導出或提取關於類別、方法、屬性、參數等的詳細信息,包括註釋。這種動態取得的資訊以及動態呼叫物件的方法的功能稱為反射API。
反射是操縱物件導向範式中元模型的API,其功能十分強大,可協助我們建構複雜,可擴充的應用。
其用途如:自動載入插件,自動產生文檔,甚至可用來擴充PHP語言。
反射功能很強大,那具體怎麼用呢?有哪些應用場景呢?以CI框架的CI_Upload類別來說明。 (全域搜尋ReflectionClass了也就只發現了這一處有用到反射。)
這個方法的核心邏輯是呼叫方實例化CI_Upload時傳一個$config數組,方法內將數組裡的所有配置賦值給對應的類別成員屬性(如果屬性有對應的set_*方法則呼叫set_*方法)
public function initialize(array $config = array(), $reset = TRUE){ $reflection = new ReflectionClass($this); ... #遍历config,如果存在set_方法调用set方法,没有则直接赋值 foreach ($config as $key => $v) { if (method_exists($this, 'set_' . $key)) { $this->{'set_' . $key}($v); }else{ $this->$key =$v; } } ...
這種方法有個弊端:無法判斷config陣列的所有key是否合法,是否是類別的成員屬性
而使用反射則可以實現判斷。
反射在這裡的體現的好處是:可以判斷類別是否存在屬性(hasProperty
),和判斷類別是否存在方法(hasMethod
)。
D:\project\app\system\libraries\Upload.php/** * Initialize preferences * * @param array $config * @param bool $reset * @return CI_Upload */public function initialize(array $config = array(), $reset = TRUE){ $reflection = new ReflectionClass($this); ... foreach ($config as $key => &$value) { if ($key[0] !== '_' && $reflection->hasProperty($key)) { if ($reflection->hasMethod('set_'.$key)) { $this->{'set_'.$key}($value); } else { $this->$key = $value; } } } ...
關於反射(不管是反射類別(ReflectionClass)或是反射函數ReflectionFunction,實際上就是類別和函數的區別)記住一點就行:反射類別/函數可以獲取類別的一切信息,包括:
- 類別基本資訊(類別名稱、是否是抽象類別、是否可實例化、類別是否為final或abstract)
- 類別的方法、方法是否存在、方法傳回值、方法的註解、Method Names
- 類別的屬性,靜態屬性,常數
- 所在命名空間 Namespace
針對有上述狀況需求的,不妨利用反射來解決:)
以上是php高級特性--反射的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!