php 反射機制

一、介紹

    PHP5添加了一項新的功能:Reflection。這個功能使得phper可以reverse-engineer class, interface,function,method and extension。通過PHP代碼,就可以得到某object的所有信息,並且可以和它交互。
 反射是什麼?
它是指在PHP運行狀態中,擴展分析PHP程序,導出或提取出關於類、方法、屬性、參數等的詳細信息,包括註釋。這種動態獲取的信息以及動態調用對象的方法的功能稱爲反射API。反射是操縱面向對象範型中元模型的API,其功能十分強大,可幫助我們構建複雜,可擴展的應用。
其用途如:自動加載插件,自動生成文檔,甚至可用來擴充PHP語言。
php反射api由若干類組成,可幫助我們用來訪問程序的元數據或者同相關的註釋交互。藉助反射我們可以獲取諸如類實現了那些方法,創建一個類的實例(不同於用new創建),調用一個方法(也不同於常規調用),傳遞參數,動態調用類的靜態方法。
      反射api是php內建的oop技術擴展,包括一些類,異常和接口,綜合使用他們可用來幫助我們分析其它類,接口,方法,屬性,方法和擴展。這些oop擴展被稱爲反射。
      通過ReflectionClass,我們可以得到Person類的以下信息:
     1)常量 Contants
     2)屬性 Property Names
     3)方法 Method Names靜態
     4)屬性 Static Properties
     5)命名空間 Namespace
     6)Person類是否爲final或者abstract

 2、代碼

     2.1  定義一個類   (類裏包含 成員變量、方法、註釋等)。

class Refl
{
    public $a = 1;
    private $ab = 2;

    public static $instance = null;

    /**
     * A類的abc 方法
     * @param $a
     * @param $b
     * @return string
     */
    public function abc($a, $b)
    {
        return $a . "|" . $b;
    }

    /**
     * type 方法
     * @param int $type
     * @return int
     */
    public function mf($type = 1)
    {
        return $type;
    }

    public function emp()
    {
        return 'emp';
    }
}

      2.2 測試用例

       

        $obj = new \Refl();
        //dump($obj);

        $obj2 = new \ReflectionClass($obj); // 建立 A 類的反射類
        //dump($obj2);

        $instance = $obj2->newInstance(); // 相當於實例化了A 類
        //dump($instance);

        $methods = $obj2->getMethods(); // 獲取類中的所有方法
        //dump($methods);

        foreach ($methods as $method) {
           // dump($method->getDocComment()); // 獲取方法註釋
        }

        $properties = $obj2->getProperties(); // 獲取類中的所有屬性
        //dump($properties);

        // 方法1
        //echo $instance->abc(1, 2);

        // 方法2
        $method = $obj2->getMethod('abc');
        //echo $method->invokeArgs($instance, ["1111", 2222]);

        // 方法3
        $method = $obj2->getMethod('emp');
        //echo $method->invoke($instance);

        // 判斷某個方法是否是私有的
        $method = new \ReflectionMethod($obj, "abc");
        if ($method->isPublic()) {
            //echo "此方法是公有的";
        }

        $params = $method->getParameters();
        //dump($params); // 獲取方法中的參數

        $number = $method->getNumberOfParameters(); // 獲取參數的個數
        //dump($number);

   ps : 官方文檔 api

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章