PHPEncode書いた

The JUI 2009 Returnsに参加してきました。発表者の皆様お疲れさまでした!!!!

JavaScript は柔軟な文法を持っていながら、ドメイン特化型言語として生まれた宿命か、何度もその寿命を宣告されてきた言語だと思いますが、今回の発表はそんなことを微塵も感じさせない、JavaScript の未来を予見させるような talk がいっぱいでとても触発されました!特に、JavaScript の未来型ユーザーインターフェイスについての知見を得ようとして参加したのですが、この期待を完全に、根本から、裏切る*12 つの presentation が印象的でありました。

  • Yoshinori Takesako - Polyglot
  • Yosuke Hasegawa - jjencode

まあそんなわけで発表中に適当に手を動かして作りました。

PHPEncode
f:id:moriyoshi:20090711010806p:image

です。

何をするためのもの?

任意の PHP スクリプトを「ほぼ」記号だけの形式に変換します。

仕組み

PHPには未定義の定数を文字列として扱うという、セクシーな言語仕様があります*2

<?php
$hoge = HOGE; // $hoge には "HOGE" が代入される。
?>

これを利用して、

<?php
$false = !_; // !(bool)"_"
$true = !!_; // !!(bool)"_"
?>

のように true と false を作り、あとは

<?php
$ten = ((true << true) << true | true) << true;
?>

数値をこのようなビットシフトと bitwise or の羅列に変換して、chr() でそれを文字にして…。
というようなことをやっております。ね、簡単でしょう?

Where do we go from here?

「ほぼ」が何とかならないのは弾さんあたりが解説してくれていると思いますので考えてみてください。

PHPのobfuscatorにこれ以上時間を費やすのは無駄だと弾言できる」

Enjoy!

*1:いい意味で

*2:ちなみに、E_NOTICEが出る