<?php //php反射機制 /* //用途 1 該擴展分析php程序,導出或提取出關於類,方法,屬性,參數等詳細信息,包括注釋 //Reflection可以說是對php庫函數: /classes/objects類/對象函數的一個擴展 //主要用在通過程序檢測現有的php程序內部關於類,方法等信息,並做出處理 class testClass { public function testFunc($param1, $param2=0) { } } //reflectionMethod 反射類,該類報告了一個訪法的有關信息 $method = new ReflectionMethod('testClass','testFunc'); $params = $method->getParameters(); foreach ($params as $param) { echo "param name:".$param->getName()."<BR><BR>"; if($param->isOptional()) { echo "Default value:".$param->getDefaultValue()."<BR><BR>"; } if($param->allowsNull() ===true) { echo "可以為空"; }else{ echo "不能為空"; } echo "<BR>=================<BR>"; } */ //Reflection::export(new ReflectionExtension('reflection')); //打印出reflection api實例的每一個類,方法和參數細節 //我們通過Reflection的export()方法實現這種輸出 //get_declared_classes() 返回每一個內建的php類包括系統類庫 /*foreach (get_declared_classes() as $class) { $reflectionClass = Reflection::export(new ReflectionClass($class)); //echo "<BR><BR>============================<BR>"; if($reflectionClass->isUserDefined()===true) //用戶自定義的類 { Reflection::export($reflectionClass); echo "<BR><BR>============================<BR>"; } }*/ /*class ClassOne { public function callClassOne($arr) { print "In Class One, str:<B>{$arr[0]}</B>"; } } class ClassOneDelegator { private $targets; function __construct() { $this->targets[] = new ClassOne(); } //__call()函數在一個對象的上下文中,如果調用的方法不存在的時候,它被觸發 function __call($name, $args) { //echo $name."<BR><BR>"; //var_dump($args); foreach($this->targets as $obj) { $r = new ReflectionClass($obj); //取得該類的詳細信息 //var_dump($r->getMethod($name)); if($method =$r->getMethod($name)) //獲取該類是否有$name這個方法 { //方法為公有,並且測試該類是否為抽象類 if($method->isPublic() && !$method->isAbstract()) { return $method->invoke($obj,$args); //invoke 調用該方法 } } } } } $obj = new ClassOneDelegator(); $str = 'I love You'; $obj->callClassOne($str);*/ //PHP反射 API--利用反射 技術實現的插件系統架構 interface Iplugin { public static function getName(); } //查詢插件函數 function findPlugins() { $plugins = array(); foreach (get_declared_classes() as $class) { //獲取所有已經加載的類 $reflectionClass = new ReflectionClass($class); //implementsInterface() 測試是否實現了某個特定的接口 if($reflectionClass->implementsInterface('Iplugin')) { $plugins[] = $reflectionClass; } } return $plugins; } //計算菜單 function computeMenu() { $menu = array(); foreach(findPlugins() as $plugin) { //hasMethod 測試判斷是否有特定的方法 if($plugin->hasMethod('getMenuItems')) { $reflectionMethod = $plugin->getMethod('getMenuItems'); //獲取方法內容 //如果為靜態化的直接調用 if($reflectionMethod->isStatic()){ //是否為靜態方法 $items = $reflectionMethod->invoke(null); //執行訪方法 }else{ //其它情況需要先進行實例化操作 //創建一個該類實例 $pluginInstance = $plugin->newInstance(); $items = $reflectionMethod->invoke($pluginInstance); } $menu = array_merge($menu,$items); //進行數組合並 } } return $menu; } function computeArtides() { $artides = array(); foreach(findPlugins() as $plugin) { if($plugin->hasMethod('getArtides')) { $reflectionMethod = $plugin->getMethod('getArtides'); if($reflectionMethod->isStatic()) { $items = $reflectionMethod->invoke(null); }else{ $pluginInstance = $plugin->newInstance(); $items = $reflectionMethod->invoke($pluginInstance); } $artides = array_merge($artides, $items); } } return $artides; } class MyCoolPugin implements Iplugin { public static function getName() { return "MycoolPlugin"; } public static function getMenuItems() { return array(array('description'=>'MycoolPlugin','link'=>'/MyCoolPlugin')); } public function getArtides() { return array(array('path'=>'/MycoolPlugin','title'=>'this is a really cool artide','text'=>'xianglingchuan')); } } $menu = computeMenu(); $artides = computeArtides(); var_dump($menu); echo "<BR>=================<BR>"; var_dump($artides); echo "<BR>=================<BR>"; ?>