1. 程式人生 > >PHP的反射機制講解

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

例子

  1. class Person {    
  2.     /**  
  3.      * For the sake of demonstration, we"re setting this private 
  4.      */
  5.     private$_allowDynamicAttributes = false;  
  6.     /** type=primary_autoincrement */
  7.     protected$id = 0;  
  8.     /** type=varchar length=255 null */
  9.     protected$name;  
  10.     /** type=text null */
  11.     protected$biography;  
  12.         publicfunction getId()  
  13.         {  
  14.             return$this->id;  
  15.         }  
  16.         publicfunction setId($v)  
  17.         {  
  18.             $this->id = $v;  
  19.         }  
  20.         publicfunction getName()  
  21.         {  
  22.             return$this->name;  
  23.         }  
  24.         publicfunction setName($v)  
  25.         {  
  26.             $this->name = $v;  
  27.         }  
  28.         publicfunction getBiography()  
  29.         {  
  30.             return$this->biography;  
  31.         }  
  32.         publicfunction setBiography($v)  
  33.         {  
  34.             $this->biography = $v;  
  35.         }  
  36. }  
接下來反射它,只要把類名"Person"傳遞給ReflectionClass就可以了:
  1. $class = new ReflectionClass('Person');//建立 Person這個類的反射類
  2. $instance  = $class->newInstanceArgs($args);//相當於例項化Person 類

獲取屬性(Properties):

  1. $properties = $class->getProperties();  
  2. foreach($propertiesas$property) {  
  3.     echo$property->getName()."\n";  
  4. }  
  5. // 輸出:
  6. // _allowDynamicAttributes
  7. // id
  8. // name
  9. // 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)獲取註釋:

 通過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

3)獲取類的方法

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

4)執行類的方法:

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


相關推薦

PHP反射機制講解

介紹:PHP5添加了一項新的功能:Reflection。這個功能使得phper可以reverse-engineer class, interface,function,method and extension。通過PHP程式碼,就可以得到某object的所有資訊,並且可以和它

PHP反射機制簡單理解

什麼是反射呢? 在PHP的面向物件程式設計中的物件,它被系統賦予自省的能力,而這個自省的過程,我們把它叫做反射。 我們對反射的直觀理解可以是,根據達到地,找到出發地和來源這麼一個過程,通俗來講就是,我給你一個光禿禿的物件,完事你可以根據這個物件,知道它所屬的類,擁有哪些方法。 在PH

PHP 反射機制Reflection

簡介 PHP Reflection API是PHP5才有的新功能,它是用來匯出或提取出關於類、方法、屬性、引數等的詳細資訊,包括註釋。 class Reflection { } interface Reflector { } class ReflectionExcept

php反射機制以及利用php反射機制實現可插拔可擴充套件的外掛架構

反射是什麼? 它是指在PHP執行狀態中,擴充套件分析PHP程式,匯出或提取出關於類、方法、屬性、引數等的詳細資訊,包括註釋。這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為反射API。 反射是操縱面向物件範型中元模型的API,其功能十分強大,可幫助我們構建複雜,可擴充

php反射機制

PHP5添加了一項新的功能:Reflection,這個功能使得phper可以reverse-engineer class, interface,function,method and extension,通過php程式碼,就可以得到某object的所有資訊,並且可以和它互動

PHP反射機制原理與用法詳解

本文例項講述了PHP反射機制原理與用法。分享給大家供大家參考,具體如下: 反射 面向物件程式設計中物件被賦予了自省的能力,而這個自省的過程就是反射。 反射,直觀理解就是根據到達地找到出發地和來源。比如,一個光禿禿的物件,我們可以僅僅通過這個物件就能知道它所屬的類、擁有哪些方

PHP反射機制(二)

PHP5.* 反射API ReflectionClass 反射類用於獲取類的註釋、屬性、引數、方法、PHP擴充套件資訊、修飾符等等(詳細:官網文件) example: <?php c

PHP 反射機制

簡介 面向物件變成中物件被賦予了自省的能力,而這個自省的過程就是反射。 反射,直觀理解就是根據到達地找到出發地和來源。比方說,我給你一個光禿禿的物件,我可以僅僅通過這個物件就能知道它所屬的

理解php反射機制-1

面向物件的程式設計中物件被賦予了自省的能力,而這個自省的過程就是反射.通過使用反射api就能夠實現動態的獲 取一個類所有屬性和方法以及呼叫該方法和屬性.  如果把php執行時看做是一面鏡子, 把php程式碼看做是一個物體。  當你的程式在php執行時執行的時候, 你的程式想知道你現在執行的php程式碼的一些資

PHP反射機制實現動態代理的程式碼

演示用程式碼如下所示: <?php class ClassOne { function callClassOne() { print "In Class One"; } } class ClassOneDelegator { private $targets; f

跟著辛星用PHP反射機制來實現插件

red 實現 track 這一 列表 each 方法 fun 繼承 我的博文的前一篇解說了PHP的反射機制是怎麽回事,假設讀者還不清楚反射機制,能夠搜索下或者看我的博文,都是不錯的選擇。我們開始解說一下怎麽用PHP來實現插件機制。所謂插件機制。就是我們定義

PHP反射機制

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

PHP OOP 反射機制

 初步接觸反射機制(可以獲取到改類的所有資訊) ReflectionClass 類報告了一個類的有關資訊。 <?php header("content-type:text/html;charset=utf-8"); // 未知類 框架的架構; class Dog{

php laravel實現依賴注入原理(反射機制

在使用laravel的時候,可以看到大量地使用了依賴注入。比如控制器中的HttpRequest物件,各種Model的實現類等等。這種實現方式的好處在於不需要再方法中頻繁地new某些例項,實現模組的解耦。 依賴注入使用PHP反射API實現 反射機制被多種語言使用,用來獲取類、例項物件、方法

跟著辛星深入探討一下PHP反射機制

      早在之前學習Java的時候,清楚的記得是學完了多執行緒之後學習的反射,現在在PHP中當然也有反射機制,如果童鞋你還不明白,那就需要搞明白奧,畢竟反射的功能還是蠻強大的,學習它還是很具有現實意義的。 反射從簡單去理解就是我們拿到一個類,得到這個類的一些資訊,比如它

這是轉載的 java反射機制與原理,原作者講解的相對很通俗易懂

轉自這裡 Java的反射機制是Java特性之一,反射機制是構建框架技術的基礎所在。靈活掌握Java反射機制,對大家以後學習框架技術有很大的幫助。 那麼什麼是Java的反射呢?        大

反射PHP反射機制【原創】

摘要:主要是參考列旭鬆、陳文著的《PHP核心技術與最佳實踐》的1.5節。 1.1 定義 反射,直觀理解就是根據到達地找到出發地和來源。比如說,給你一個光禿禿的物件,可以僅僅通過這個物件就能知道它所屬的類以及擁有的方法。 反射,指在PHP執行狀態中,擴充套件分析PHP

跟著辛星用PHP反射機制來實現外掛

     我的博文的前一篇講解了PHP的反射機制是怎麼回事,如果讀者還不清楚反射機制,可以搜尋下或者看我的博文,都是不錯的選擇,我們開始講解一下怎麼用PHP來實現外掛機制。所謂外掛機制,就是我們定義一個介面,即我們定義一個interface,然後第三方外掛就去實現這個int

反射機制的理解

java反射機制的理解以前學過很長時間反射機制,很是不理解?今天終於看到一本書講的很詳細。所有反射機制都是通過一個類叫做Class來實現:讓我看看書上是怎麽介紹的ClassClass是java.lang包中的類,該類的實例用來封裝對象運行時的狀態。當一個類被加載且創建對象時,和該類相關的一個類型為Claas的

Python的反射機制、hasattr() getattr() setattr() 函數使用方法詳解

對象 tee lin sel __main__ err ace traceback 一個 hasattr(object, name)判斷一個對象裏面是否有name屬性或者name方法,返回BOOL值,有name特性返回True, 否則返回False。需要註意的是name要用