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ならではの話題を紹介します。ではまた!