忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/03/27 19:36 |
PHP5.5.3 PHP5でrunkit
PHP界きっての反則技、runkit
はXAMPPにデフォルトで入っていたのですが、いつのまにか消えていました。
もはやPECLがメンテナンスされてないんですよね。

Windows版runkitをメンテしてる人を見つけたので試してみます。
試したバージョンは「php_runkit-1.0.4-5e179e978a-5.5-vc11.dll」。
TSのほうです。

ダウンロードしたファイルをxampp/php/ext内に入れて、php.iniに
	extension=php_runkit.dll
	runkit.internal_override = true
	runkit.superglobal = _FOO
と書いておきます。
phpinfo()でrunkitの項目が追加されていることを確認しましょう。

runkitを使うと、通常では絶対に有り得ないコーディングが可能になります。
<?php
	// 定数
	define('HOGE', 1);
	print(HOGE); // 1
	
	runkit_constant_redefine('HOGE', 2);
	print(HOGE); // 2
	
	runkit_constant_remove('HOGE');
	print(HOGE); // Notice: Use of undefined constant HOGE
	
	// 関数
	runkit_function_redefine('phpinfo', null, 'print("a");');
	phpinfo(); // "a"と表示される
	
	runkit_function_remove('phpinfo');
	phpinfo(); // Call to undefined function phpinfo()
	
	// 返り値を利用しているか確認
	function foo() {
		var_dump(runkit_return_value_used());
	}
	foo(); // false
	$a = foo(); // true
	
	// スーパーグローバル
	$_FOO = 'foo';
	$_BAR = 'bar';
	function test(){
		print($_FOO); // foo
		print($_BAR); // Notice: Undefined variable: _BAR
	}
	test();
	
	var_dump(runkit_superglobals());
掟破りにも程があるだろ。

見てのとおり、定数も関数も制限?何それってレベルで上書きできてしまいます。

runkit.internal_overrideは組み込み関数のオーバーライドを制御するディレクティブです。
デフォルトはfalseで、ユーザ定義関数しか上書きできません。
trueにすると上記のようにphpinfo()等も上書きできるようになります。
さすがにechoのような言語構造は上書きできません。

runkit.superglobalは、「スーパーグローバル変数として扱う変数を追加する」というこれまた反則なディレクティブです。
今回は"_FOO"を追加しているので、$_FOOが$_REQUEST等と同格のスーパーグローバル変数になります。
runkit_superglobals()は、現在のスーパーグローバル変数一覧を取得します。
$GLOBALS、$_REQUEST、$_SESSIONといった見慣れた変数と一緒に$_FOOが入っているのが確認できます。

runkit_return_value_used()は他と毛色の違う関数で、関数呼び出しが、その返り値を使っているかを確認できるという、どういうときに使うのかよくわからない機能です。
いやほんとこれどういうときに使うんだ?

あとrunkit_lint()でコードチェックとかも可能なはずなのですが、手元環境ではapache毎落ちてしまって確認できませんでした。
理由はよくわかりません。
PR


2013/12/30 20:16 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<PHP5.5.3 runkitでprivateな__constructを呼び出す | HOME | 買ったものリスト 2013/12/29>>
忍者ブログ[PR]