最近在看java程式設計思想,看到類型資訊這一章,講到了類別的資訊以及反射的概念。順便溫故一下php的反射東西。手冊是這樣說的:"PHP 5 具有完整的反射API,增加了對類別、介面、函數、方法和擴展進行反向工程的能力。 此外,反射API 提供了方法來取出函數、類別和方法中的文件註解。所謂的逆向說白就是能獲取關於類、方法、屬性、參數等的詳細信息,包括註釋! 文字總是那麼枯燥,舉個例子
class Foo { public $foo = 1; protected $bar = 2; private $baz = 3; /** * Enter description here ... */ public function myMethod() { echo 'hello 2b'; } } $ref = new ReflectionClass('Foo'); $props = $ref->getProperties(); foreach ($props as $value) { echo $value->getName()."\n"; } //output //foo //bar //baz
ReflectionClass 這個類返回時某個類的相關的信息,比如屬性,方法,命名空間,實作那些介面等!上個例子中ReflectionClass:: getProperties 傳回是 ReflectionProperty 物件的陣列。
ReflectionProperty 類別報告了類別的屬性的相關資訊。例如 isDefault isPrivate isProtected isPublic isStatic等,方法getName 就是取得屬性的名稱!
以上是獲取屬性的,還有獲取類別方法的例如
class Foo { public $foo = 1; protected $bar = 2; private $baz = 3; /** * Enter description here ... */ public function myMethod() { echo 'hello 2b'; } } $ref = new ReflectionClass('Foo'); $method = $ref->getMethod('myMethod'); $method->invoke($ref->newInstance());
ReflectionClass::getMethod 是反是一個ReflectionMethod 類型,ReflectionMethod 類別報告了一個方法的相關信息,比如isAbstract isPrivate重要的方法Invoke,InvokeArgs 是執行方法!
其他的物件可以看看手冊,不是很難!
那反射究竟有哪些用途?
反射是一個動態運行的概念,綜合使用他們可用來幫助我們分析其它類,接口,方法,屬性,方法和擴展。還可建構模式,例如動態代理。在一些php框架中使用反射也是很常,像是kohana,yii,下面是kohana 的實作mvc的程式碼,就是用到了反射!
// Start validation of the controller $class = new ReflectionClass(ucfirst(Router::$controller).'_Controller'); // Create a new controller instance $controller = $class->newInstance(); // Load the controller method $method = $class->getMethod(Router::$method); // Execute the controller method $method->invokeArgs($controller, $arguments);
上面的程式碼可以清楚地看到這個框架的流程!透過Router 其實處理url的類,透過Router可以取得哪個控制器、哪個方法!然後再執行方法!
以上就是對PHP 反射的資料整理,後續繼續補充相關資料,謝謝大家對本站的支持!
更多php 的反射詳解及範例程式碼相關文章請關注PHP中文網!