程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 【夯實PHP基礎】PHP的反射機制,夯實php反射機制

【夯實PHP基礎】PHP的反射機制,夯實php反射機制

編輯:關於PHP編程

【夯實PHP基礎】PHP的反射機制,夯實php反射機制


本文地址

分享提綱:

  1. 介紹

  2. 具體例子

    2.1 創建Persion類

    2.2 反射過程

    2.3 反射後使用

 

1. 介紹



  -- 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. 具體例子


 

創建一個Person類,然後使用ReflectionClass反射它      2.1)【創建Persion類】      class Person { /** * For the sake of demonstration, we"re setting this private */ private $_allowDynamicAttributes = false; /** type=primary_autoincrement */ protected $id = 0; /** type=varchar length=255 null */ protected $name; /** type=text null */ protected $biography; publicfunction getId() { return $this->id; } public function setId($v) { $this->id = $v; } public function getName() { return $this->name; } public function setName($v) { $this->name = $v; } public function getBiography() { return $this->biography; } public function setBiography($v) { $this->biography = $v; } } Persion

 

  2.2)【反射過程】
接下來反射它,只要把類名"Person"傳遞給ReflectionClass就可以了:

 
1     $class = new ReflectionClass('Person');//建立 Person這個類的反射類
2     $instance  = $class->newInstanceArgs($args);//相當於實例化Person 類

 

   2.3)【反射後使用】

    2.3.1)獲取屬性(Properties)

 
    $properties = $class->getProperties();  
    foreach($properties as $property) {  
    echo $property->getName()."\n";  
    }  
    // 輸出:
    // _allowDynamicAttributes
    // id
    // name
    // biography

 


默認情況下,ReflectionClass會獲取到所有的屬性,private 和 protected的也可以。如果只想獲取到private屬性,就要額外傳個參數:
$private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);
可用參數列表:
               ReflectionProperty::IS_STATIC
               ReflectionProperty::IS_PUBLIC
               ReflectionProperty::IS_PROTECTED
               ReflectionProperty::IS_PRIVATE
     如果要同時獲取public 和private 屬性,就這樣寫:ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED。
   通過$property->getName()可以得到屬性名。


    2.3.2)【獲取注釋】

 

  通過getDocComment可以得到寫給property的注釋。

 
 1     foreach($propertiesas$property) {  
 2     if($property->isProtected()) {  
 3     $docblock = $property->getDocComment();  
 4             preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches);  
 5     echo$matches[1]."\n";  
 6         }  
 7     }  
 8     // Output:
 9     // primary_autoincrement
10     // varchar
11     // text

 

    2.3.3)【獲取類的方法】

    獲取方法(methods):通過getMethods() 來獲取到類的所有methods。

    2.3.4)【執行類的方法】

 
1         $instance->getBiography(); //執行Person 裡的方法getBiography
2         //或者:
3         $ec=$class->getmethod('getName');  //獲取Person 類中的getName方法
4         $ec->invoke($instance);       //執行getName 方法

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved