PHPでも記号プログラミング!
2010-12-02
こんにちは。hnwと申します。仕事でPHPのコードを書いたり読んだりしています。PHPは別に好きじゃないと言いつつ、PHPがDISられるとムキになっちゃうような、ちょっと面倒なタイプの人間です。
このイベントではPHPの話題を何回か書かせて頂きます。
では、本題に入りましょう。PHPに慣れていない方も多いと思いますので、まずはPHPでHello, worldに挑戦してみます。
<?=('`'^'(').('_'^':').('@'^',').('@'^',').('@'^'/').(',').('~'^'^').('_'^'(').('@'^'/').('_'^'-').('@'^',').('_'^';').('!')?>
PHP使いの人なら見慣れたPHPのコードです。では、早速実行してみましょう。
$ php -d short_open_tag=1 /tmp/hello.php Hello, world!
無事、記号だけで動作しました!PHPでは「<?= ?>」で囲まれた部分の評価結果を表示できるので、これを利用したわけです。ただし、これは通常の環境では有効ではありません。php.iniディレクティブのshort_open_tagを"1"にする必要があります。
評価式の部分では、記号だけで1文字づつ文字列連結しているだけです。PHPではPerl同様、文字列に対してビット演算(AND,OR,XOR,NOT)ができるので、記号だけで0x00から0xffまでの全ての文字を作ることが可能です。たとえば、UTF-8で「はろー、わーるど!」とする場合は次のようになります。
<?=('`'|~'|').(~'~').('/'|~'~').('`'|~'|').('_'^~'"').('_'^~'-').('`'|~'|').(~'|').('<'|~'_'). ('`'|~'|').('^'^~'!').(~'~').('`'|~'|').('_'^~'"').('_'^~'/').('`'|~'|').(~'|').('<'|~'_'). ('`'|~'|').('_'^~'"').('_'^~'+').('`'|~'|').(~'~').(')'|~'~').('/'|~'?').('<'|~'_').(~'~')?>
Perlと同じままだと工夫が無いので、次回はPHPならではの話題を紹介します。ではまた!