學習參考: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);