首頁  >  文章  >  後端開發  >  php高級特性--反射的實例詳解

php高級特性--反射的實例詳解

伊谢尔伦
伊谢尔伦原創
2017-07-01 10:47:401383瀏覽

一、什麼是反射?

它是指在PHP運行狀態中,擴展分析PHP程序,導出或提取關於類別、方法、屬性、參數等的詳細信息,包括註釋。這種動態取得的資訊以及動態呼叫物件的方法的功能稱為反射API。
反射是操縱物件導向範式中元模型的API,其功能十分強大,可協助我們建構複雜,可擴充的應用。

二、反射的用途

其用途如:自動載入插件,自動產生文檔,甚至可用來擴充PHP語言。

三、反射具體應用實例-以CI框架的一個實作例子來說

反射功能很強大,那具體怎麼用呢?有哪些應用場景呢?以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)。

方法二、CI框架內的實作

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn