Advent Calendar 16日目 PHP コンパイラの実行を中止する方法

今回は、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

まとめ

__halt_compiler について説明しました。

ちなみに、__halt_compiler は関数ではありません。
実際に PHP スクリプトのパース処理見ると、泥臭い処理しています。

なんで関数呼び出しっぽい見た目にしたのやら……