PHP 反射,學習

來源:互聯網
上載者:User

學習參考:http://cn.php.net/manual/en/book.reflection.php

反射API,包含一系列的類、異常和介面。可用來檢測分析其他的類、介面、方法、屬性、函數和擴充。

Reflector ,是其它反射類的介面類。Reflection 反射類ReflectionExtension 分析報告擴充類有關擴充ReflectionClass類: 分析報告類有關擴充ReflectionFunction 分析報告函數有關擴充ReflectionFunctionAbstract: A parent class to ReflectionFunction, read its description for details.ReflectionMethod 類報告有關方法的資訊。ReflectionObject 類報告有關對象的資訊。ReflectionParameter類檢索一個函數或方法的參數資訊。ReflectionProperty類報告一個類的屬性資訊。

============

eg:

<?phpclass userClass {  public function userMethod($userParameter='default') {}}foreach(get_declared_classes() as $class) {  $reflectionClass = new ReflectionClass($class);  if($reflectionClass->isUserDefined()) {    Reflection::export($reflectionClass);  }}

============

Reflector ,是其它反射類的介面類。

Reflector {    /* 方法 */    abstract public static string export ( void )    abstract public string __toString ( void )}

Reflection

Reflection {    //匯出一個類或方法的詳細資料    public static void export ( Reflector $reflector [, bool $return = false ] )    //取得修飾符的名字    public static array getModifierNames ( int $modifiers )}

ReflectionExtension 分析報告擴充類有關擴充

ReflectionExtension implements Reflector {/* 屬性 */public $ReflectionExtension->name ; //副檔名稱/* 方法 */final private void ReflectionExtension::__clone ( void )   // 複製ReflectionExtension::__construct ( string $name )  //public static string ReflectionExtension::export ( string $name [, string $return = false ] )public array ReflectionExtension::getClasses ( void )  //擷取類public array ReflectionExtension::getClassNames ( void )   //擷取類名public array ReflectionExtension::getConstants ( void )    //擷取常數public array ReflectionExtension::getDependencies ( void ) //擷取的依賴public array ReflectionExtension::getFunctions ( void )    //擷取擴充函數public array ReflectionExtension::getINIEntries ( void )   //擷取擴充INI條目public string ReflectionExtension::getName ( void )    //擷取擴充public string ReflectionExtension::getVersion ( void )    //擷取擴充的版本public string ReflectionExtension::info ( void )    //擷取擴充資訊public void ReflectionExtension::isPersistent ( void )    //判斷這個類是否是是持久性的public void ReflectionExtension::isTemporary ( void )    //判斷這個類是否是暫時的public string ReflectionExtension::__toString ( void )    //}

ReflectionClass類: 分析報告類有關擴充

class ReflectionClass implements Reflector{    final private __clone()    public object __construct(string name)    public string __toString()    public static string export() //匯出該類的詳細資料    public string getName() //取得類名或介面名    public bool isInternal() //測試該類是否為系統內部類    public bool isUserDefined() //測試該類是否為使用者自訂類    public bool isInstantiable() //測試該類是否被執行個體化過    public bool hasConstant(string name) //測試該類是否有特定的常量    public bool hasMethod(string name) //測試該類是否有特定的方法    public bool hasProperty(string name) //測試該類是否有特定的屬性    public string getFileName() //取得定義該類的檔案名稱,包括路徑名    public int getStartLine() //取得定義該類的開始行    public int getEndLine() //取得定義該類的結束行    public string getDocComment() //取得該類的注釋    public ReflectionMethod getConstructor() //取得該類的建構函式資訊    public ReflectionMethod getMethod(string name) //取得該類的某個特定的方法資訊    public ReflectionMethod[] getMethods() //取得該類的所有的方法資訊    public ReflectionProperty getProperty(string name) //取得某個特定的屬性資訊    public ReflectionProperty[] getProperties() //取得該類的所有屬性資訊    public array getConstants() //取得該類所有常量資訊    public mixed getConstant(string name) //取得該類特定常量資訊    public ReflectionClass[] getInterfaces() //取得介面類資訊    public bool isInterface() //測試該類是否為介面    public bool isAbstract() //測試該類是否為抽象類別    public bool isFinal() //測試該類是否聲明為final    //取得該類的修飾符,傳回值類型可能是個資源類型    //通過Reflection::getModifierNames($class->getModifiers())進一步讀取    public int getModifiers()    public bool isInstance(stdclass object) //測試傳入的對象是否為該類的一個執行個體    public stdclass newInstance(mixed* args) //建立該類執行個體    public ReflectionClass getParentClass() //取得父類    public bool isSubclassOf(ReflectionClass class) //測試傳入的類是否為該類的父類    public array getStaticProperties() //取得該類的所有靜態屬性    public mixed getStaticPropertyValue(string name [, mixed default]) //取得該類的靜態屬性值,若private,則不可訪問    public void setStaticPropertyValue(string name, mixed value) //設定該類的靜態屬性值,若private,則不可訪問,有悖封裝原則    public array getDefaultProperties() //取得該類的屬性資訊,不含靜態屬性    public bool isIterateable()    public bool implementsInterface(string name) //測試是否實現了某個特定介面    public ReflectionExtension getExtension()    public string getExtensionName()}

ReflectionFunction 分析報告函數有關擴充

ReflectionFunction extends ReflectionFunctionAbstract implements Reflector {}ReflectionFunction::__construct — Constructs a ReflectionFunction objectReflectionFunction::export — 匯出一個函數的詳細資料ReflectionFunction::getClosure — 返回的函數動態建立的封閉ReflectionFunction::invoke — 調用功能ReflectionFunction::invokeArgs — 調用函數ARGSReflectionFunction::isDisabled — 檢查,如果功能被禁用

ReflectionFunctionAbstract: A parent class to ReflectionFunction, read its description for details.

ReflectionFunctionAbstract implements Reflector {}

ReflectionMethod 類報告有關方法的資訊。

ReflectionMethod extends ReflectionFunctionAbstract implements Reflector {}ReflectionMethod::__construct — Constructs a ReflectionMethodReflectionMethod::export — 匯出一個反射方法 Export a reflection method .ReflectionMethod::getClosure — 返回動態建立的方法封閉 Returns a dynamically created closure for the methodReflectionMethod::getDeclaringClass — 擷取聲明類的反射的方法 Gets declaring class for the reflected method.ReflectionMethod::getModifiers — 擷取方法的修飾符 Gets the method modifiersReflectionMethod::getPrototype — 擷取的方法原型(如果有的話) Gets the method prototype (if there is one).ReflectionMethod::invoke — InvokeReflectionMethod::invokeArgs — Invoke argsReflectionMethod::isAbstract — Checks if method is abstractReflectionMethod::isConstructor — Checks if method is a constructorReflectionMethod::isDestructor — Checks if method is a destructorReflectionMethod::isFinal — Checks if method is finalReflectionMethod::isPrivate — Checks if method is privateReflectionMethod::isProtected — Checks if method is protectedReflectionMethod::isPublic — Checks if method is publicReflectionMethod::isStatic — Checks if method is staticReflectionMethod::setAccessible — Set method accessibilityReflectionMethod::__toString — Returns the string representation of the Reflection method object.

ReflectionObject 類報告有關對象的資訊。

ReflectionObject extends ReflectionClass implements Reflector {}

ReflectionParameter類檢索一個函數或方法的參數資訊。

ReflectionParameter implements Reflector {}

ReflectionProperty類報告一個類的屬性資訊。

ReflectionProperty implements Reflector {}

ReflectionException

ReflectionException extends Exception {/* Inherited methods */final public string Exception::getMessage ( void )final public Exception Exception::getPrevious ( void )final public mixed Exception::getCode ( void )final public string Exception::getFile ( void )final public int Exception::getLine ( void )final public array Exception::getTrace ( void )final public string Exception::getTraceAsString ( void )public string Exception::__toString ( void )final private void Exception::__clone ( void )}

eg:

<?phpinterface IPlugin {  public static function getName();}class MyCoolPlugin implements IPlugin {  public static function getName() {     return 'MyCoolPlugin';  }  public static function getMenuItems() {    //Numeric indexed array of menu items    return array(array(               'description'=>'MyCoolPlugin',               'link'=>'/MyCoolPlugin'    ));  }  public static function getArticles() {    //Numeric array of articles    return array(array(                        'path'=>'/MyCoolPlugin',                        'title'=>'This is a really cool article',                        'text'=>'This article is cool because...'                       )           );  }}function findPlugins() {  $plugins = array();  foreach(get_declared_classes() as $class) {    $reflectionClass = new ReflectionClass($class);    if($reflectionClass->implementsInterface('IPlugin')) {      $plugins[] = $reflectionClass;    }  }  return $plugins;}########################################function computeMenu() {  $menu = array();  foreach(findPlugins() as $plugin) {    if($plugin->hasMethod('getMenuItems')) {      $reflectionMethod = $plugin->getMethod('getMenuItems');      if($reflectionMethod->isStatic()) {        $items = $reflectionMethod->invoke(null);      } else {        //If the method isn't static we need an instance        $pluginInstance = $plugin->newInstance();        $items = $reflectionMethod->invoke($pluginInstance);      }      $menu = array_merge($menu, $items);    }  }  return $menu;}function computeArticles() {  $articles = array();  foreach(findPlugins() as $plugin) {    if($plugin->hasMethod('getArticles')) {      $reflectionMethod = $plugin->getMethod('getArticles');      if($reflectionMethod->isStatic()) {        $items = $reflectionMethod->invoke(null);      } else {        $pluginInstance = $plugin->newInstance();        $items = $reflectionMethod->invoke($pluginInstance);      }      $articles = array_merge($articles, $items);    }  }  return $articles;}function computeSidebars() {  $sidebars = array();  foreach(findPlugins() as $plugin) {    if($plugin->hasMethod('getSidebars')) {      $reflectionMethod = $plugin->getMethod('getSidebars');      if($reflectionMethod->isStatic()) {        $items = $reflectionMethod->invoke(null);      } else {        $pluginInstance = $plugin->newInstance();        $items = $reflectionMethod->invoke($pluginInstance);      }      $sidebars = array_merge($sidebars, $items);    }  }  return $sidebars;}########################################$menu = computeMenu();$sidebars = computeSidebars();$articles = computeArticles();//This could be a lot more complexprint_r($menu);print_r($sidebars);print_r($articles);
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.