RunkitPHP 的 AOP 擴(kuò)展
runkit擴(kuò)展庫(kù)是pecl的php擴(kuò)展的一部分。
runkit提供了一套函數(shù),能讓你動(dòng)態(tài)的修改任意類(lèi)和函數(shù)的定義。根據(jù)php提供的反射機(jī)制,得到所有用戶(hù)定義的類(lèi)和函數(shù),你可以把他們重命名然后再用原來(lái)的函數(shù)名/方法名重新添加一個(gè)方法/函數(shù),重新添加的函數(shù)的函數(shù)體,你可以任意定義---用字串兒,當(dāng)你的php腳本開(kāi)始執(zhí)行時(shí),你要最先 調(diào)用你設(shè)計(jì)的這個(gè)“鉤子”,把所有的類(lèi)的方法或函數(shù)都"鉤"一遍,這樣,不管是哪個(gè)方法在執(zhí)行的時(shí)候,都會(huì)執(zhí)行到你提供的切入點(diǎn)上的代碼.
不過(guò),在使用runkit的時(shí)候,還遇到一個(gè)問(wèn)題:就是大小寫(xiě)的問(wèn)題,起初,在“鉤”方法的時(shí)候,有的方法帶有大寫(xiě)字母,通過(guò)反射得到的方法名 也是區(qū)分大小寫(xiě)的,但是,應(yīng)該在php解析執(zhí)行函數(shù)的時(shí)候,還是把所有方法名或函數(shù)名都轉(zhuǎn)換成了小寫(xiě),這樣,在用runkit提供的動(dòng)態(tài)添加方法的函數(shù)添 加方法時(shí),也忠實(shí)方法原來(lái)的命名,帶著大寫(xiě)字母就直接添進(jìn)去了,結(jié)果,再調(diào)用被鉤的方法的時(shí)候,報(bào)錯(cuò),死活也找不著原來(lái)的那個(gè)方法了,原因應(yīng)該就 是,php在解析執(zhí)行類(lèi)、方法、函數(shù)時(shí),應(yīng)該都是按小寫(xiě)形式來(lái)定位的方法和函數(shù)的,而用runkit直接添加進(jìn)去的帶有大寫(xiě)字母的函數(shù),自然就會(huì)找不到, 所以,在用runkit添加方法的時(shí)候,要把方法名都轉(zhuǎn)換成小寫(xiě),這樣php就可以找到這個(gè)方法了,函數(shù)應(yīng)該也是同樣的.
示例代碼:
php.ini:
runkit.superglobal=foo,bar
test.php:
function testme() {
echo "Foo is $foo\n";
echo "Bar is $bar\n";
echo "Baz is $baz\n";
}
$foo = 1;
$bar = 2;
$baz = 3;
testme();
輸出:
Foo is 1
Bar is 2
Baz is
兼容性: PHP 4.2 or greater
