Advent Calendar 16日目 PHP コンパイラの実行を中止する方法
「それって、 exit とか die でしょ?」 と言われそうですが、ハズレ。
exit や die は、スクリプトを終了させるものです。
何が違うのか、実際に例を見てみましょう。
exit
Code.1 exit の例
<?php echo "ok\n"; exit(); hogeeeee
これ、動きません。
syntax error で怒られます。
hogeeeee なんて構文、 PHP はありませんから。
でも、 exit の代わりにあるものを使えば動くようになります。
それが、 __halt_compiler です。
__halt_compiler
Code.2 __halt_compiler の例
<?php echo "ok\n"; __halt_compiler(); hogeeeee
これなら問題なく動く。
PHP は、__halt_compiler() を発見した時点で、コンパイルを中止します。
それ以降は何が書いてあっても無視します。
Perl での __END__ や __DATA__ みたいなモノですね。
__halt_compiler() をスクリプトに含む場合、その位置は __COMPILER_HALT_OFFSET__ 定数に設定されています。
ということで、 Code.3 は hogeeeee と表示されます。
Code.3 __COMPILER_HALT_OFFSET__ 使用例
<?php echo file_get_contents(__FILE__, null, null, __COMPILER_HALT_OFFSET__); __halt_compiler(); hogeeeee