とりあえずデフォルトでは入っていないのでpeclコマンドでインストールする必要があります。
ただXAMPPの場合最初から入っているので、php.iniのextension=php_runkit.dllの行のコメントを外すだけです。
本来はRunkit_Sandboxクラスを利用したデバッグ等に威力を発揮するのでしょうが、使い方がよくわかりません。
http://jp2.php.net/manual/ja/runkit.sandbox.php
さて、このモジュールには他にはない強力なメソッドが含まれています。
なんといっても定数の定義を覆すrunkit_constant_redefineが反則過ぎる。
runkit_constant_redefine.php
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//定数定義
define('HOGE','aaa');
print(HOGE);
//定数再定義
runkit_constant_redefine('HOGE','bbb');
print(HOGE);
//定数削除
runkit_constant_remove('HOGE');
print(HOGE);
|
5行目で'aaa'、9行目で'bbb'が表示され、13行目で定数未定義のNoticeが発生します。
定数って何?
ちなみに、通常のdefineは再定義しようとするとエラーになりますが、runkit_constant_redefineは未定義の定数に対して使用するとエラーになります。
クラスの拡張はextendsやimplementsを使うことになっていますが、実行時に元のクラスを直接いじくってしまうrunkit_method関数群が用意されています。
extendsと何が違うかというと、クラス自体を変更するのでprivateなインスタンス変数にもアクセスできてしまいます。
runkit_method.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
//クラス
class testClass{
private $a=1;
}
//通常のextends
class testClass2 extends testClass{
private $a=2;
function add2($a){$this->a=$a;}
}
$test2=new testClass2();
$test2->add2(5);
print("<html><pre>");var_dump($test2);
//メソッド追加
runkit_method_add('testClass','add','$a','$this->a=$a;');
//実行
$test=new testClass();
$test->add(5);
var_dump($test);die();
|
実行結果は以下のようになります。
object(testClass2)#1 (2) { ["a:private"]=> int(1) ["a"]=> int(5) } object(testClass)#2 (1) { ["a:private"]=> int(5) } |
Javaなんかだとprivateな$aは引き継がれなかったような気がしますが、PHPではprivateな$aと、extendsしたクラスで再定義した$aは別物として扱われます。
作ろうと思えば以下のようなクラスが作れてしまうのでキモい。
["a:private"]=> int(3) ["a:private"]=> int(2) ["a:private"]=> int(1) |
後者の場合testClass自体を書き換えてしまうので、testClass::addはtestClass::$aにしっかりとアクセスしてくれます。
他にも基底クラスを無理矢理extendsされたクラスにしてしまうrunkit_class_adoptといった楽しい関数が揃っています。
runkit_function_redefineやrunkit_lint_fileを試してみたところ、手元のXAMPPではApacheを巻き込んで落ちてくれやがりました。何故。
しかしこのrunkit関数、定数やクラスという定義をぶち壊してしまう強力過ぎにも程がある関数ばかりなので、使用は控えておいたほうがいいと思います、というか使うべきではないような。
PR
トラックバック
トラックバックURL: