php 的反射詳解及示例代碼
最近在看java編程思想,看到類型信息這一章,講到了類的信息以及反射的概念。順便溫故一下php的反射東西。手冊(cè)是這樣說(shuō)的:"PHP 5 具有完整的反射 API,添加了對(duì)類、接口、函數(shù)、方法和擴(kuò)展進(jìn)行反向工程的能力。 此外,反射 API 提供了方法來(lái)取出函數(shù)、類和方法中的文檔注釋。"當(dāng)然手冊(cè)上說(shuō)的有些抽象!所謂的逆向說(shuō)白就是能獲取關(guān)于類、方法、屬性、參數(shù)等的詳細(xì)信息,包括注釋! 文字總是那么枯燥,舉個(gè)例子
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 這個(gè)類返回時(shí)某個(gè)類的相關(guān)的信息,比如 屬性,方法,命名空間,實(shí)現(xiàn)那些接口等!上個(gè)例子中ReflectionClass:: getProperties 返回是 ReflectionProperty 對(duì)象的數(shù)組。
ReflectionProperty 類報(bào)告了類的屬性的相關(guān)信息。比如 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 是反是一個(gè) ReflectionMethod 類型 ,ReflectionMethod 類報(bào)告了一個(gè)方法的有關(guān)信息,比如 isAbstract isPrivate isProtected isPublic isStatic isConstructor,還有一個(gè)重要的方法Invoke,InvokeArgs 就是執(zhí)行方法!
其他的對(duì)象可以看看手冊(cè),不是很難!
那反射究竟有哪些用途?
反射是一個(gè)動(dòng)態(tài)運(yùn)行的概念,綜合使用他們可用來(lái)幫助我們分析其它類,接口,方法,屬性,方法和擴(kuò)展。還可構(gòu)建模式,比如動(dòng)態(tài)代理。在一些php框架中使用反射也是很經(jīng)常,比如kohana,yii,下面是kohana 的實(shí)現(xiàn)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);
上面的代碼可以清晰看到這個(gè)框架的流程!通過(guò)Router 其實(shí)就處理url的類,通過(guò)Router可以獲取哪個(gè)控制器、哪個(gè)方法!然后再執(zhí)行方法!
以上就是對(duì)PHP 反射的資料整理,后續(xù)繼續(xù)補(bǔ)充相關(guān)資料,謝謝大家對(duì)本站的支持!
相關(guān)文章
laravel框架數(shù)據(jù)庫(kù)操作、查詢構(gòu)建器、Eloquent ORM操作實(shí)例分析
這篇文章主要介紹了laravel框架數(shù)據(jù)庫(kù)操作、查詢構(gòu)建器、Eloquent ORM操作,結(jié)合實(shí)例形式分析了laravel數(shù)據(jù)庫(kù)連接、增刪改查、排序及Eloquent ORM數(shù)據(jù)庫(kù)操作等相關(guān)使用技巧,需要的朋友可以參考下2019-12-12php中使用array_filter()函數(shù)過(guò)濾空數(shù)組的實(shí)現(xiàn)代碼
這篇文章主要介紹了php中使用array_filter()函數(shù)過(guò)濾空數(shù)組的實(shí)現(xiàn)代碼,這是瀏覽PHP手冊(cè)時(shí)無(wú)意發(fā)意的一個(gè)有意思的array_filter()函數(shù)用法,需要的朋友可以參考下2014-08-08php時(shí)間戳格式化顯示友好的時(shí)間函數(shù)分享
在一些微博系統(tǒng)中經(jīng)常要將時(shí)間于現(xiàn)在時(shí)間相比顯示為多久以前發(fā)布的,如顯示為:剛剛、5秒前、5小時(shí)前、5天前..這種顯示非常的友好,那么我們?cè)趺从胮hp來(lái)實(shí)現(xiàn)呢,這就是本文探討的內(nèi)容,各位看官請(qǐng)仔細(xì)閱讀下文2014-10-10Laravel 5框架學(xué)習(xí)之日期,Mutator 和 Scope
這篇文章主要介紹了Laravel 5框架學(xué)習(xí)之日期,Mutator 和 Scope的相關(guān)資料,需要的朋友可以參考下2015-04-04php安裝xdebug/php安裝pear/phpunit詳解步驟(圖)
PHP環(huán)境中安裝pear、phpunit以及xdebug全攻略,大家參考使用吧2013-12-12PHP用FTP類上傳文件視頻等的簡(jiǎn)單實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇PHP用FTP類上傳文件視頻等的簡(jiǎn)單實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09如何使用PHP file_exists函數(shù)檢查文件是否存在
這篇文章主要為大家介紹了PHP函數(shù)file_exists檢查文件是否存在實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Laravel框架實(shí)現(xiàn)的使用smtp發(fā)送郵件功能示例
這篇文章主要介紹了Laravel框架實(shí)現(xiàn)的使用smtp發(fā)送郵件功能,結(jié)合實(shí)例形式分析了Laravel框架相關(guān)配置及郵件發(fā)送操作技巧,需要的朋友可以參考下2019-03-03