runkit (AOP FOR PHP )資料收集

AOP爲Aspect Oriented Programming的縮寫,意爲:面向切面編程(也叫面向方面),可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種技術。AOP實際是GoF設計模式的延續,設計模式孜孜不倦追求的是調用者和被調用者之間的解耦,AOP可以說也是這種目標的一種實現。

AOP FOR PHP 探討----runkit

runkit擴展庫是pecl的php擴展的一部分, 最近兩天在用這個東西嘗試實現無侵入式的AOP。
runkit提供了一套函數,能讓你動態的修改任意類和函數的定義。根據php提供的反射機制,得到所有用戶定義的類和函數,你可以把他們重命名然後再用原來的函數名/方法名重新添加一個方法/函數,重新添加的函數的函數體,你可以任意定義---用字串兒,當你的php腳本開始執行時,你要最先調用你設計的這個“鉤子”,把所有的類的方法或函數都"鉤"一遍,這樣,不管是哪個方法在執行的時候,都會執行到你提供的切入點上的代碼.
不過,在使用runkit的時候,還遇到一個問題:就是大小寫的問題,起初,在“鉤”方法的時候,有的方法帶有大寫字母,通過反射得到的方法名也是區分大小寫的,但是,應該在php解析執行函數的時候,還是把所有方法名或函數名都轉換成了小寫,這樣,在用runkit提供的動態添加方法的函數添加方法時,也忠實方法原來的命名,帶着大寫字母就直接添進去了,結果,再調用被鉤的方法的時候,報錯,死活也找不着原來的那個方法了,原因應該就是,php在解析執行類、方法、函數時,應該都是按小寫形式來定位的方法和函數的,而用runkit直接添加進去的帶有大寫字母的函數,自然就會找不到,所以,在用runkit添加方法的時候,要把方法名都轉換成小寫,這樣php就可以找到這個方法了,函數應該也是同樣的.
 
另外,重命名的辦法並不是最好的,因爲,類中如果已經存在同樣命名的方法,那麼你在重命名方法名的時候就會出錯。除非在開發時規定方法命名中不能用某某關鍵字命名。但這樣確實不好,作爲一個開發框架,是不應該給開發者很多的限制的。


幫助手冊:http://www.php.net/manual/zh/intro.runkit.php
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章