2012-05-14

PHP: evalとPHPタグ

PHPのevalの項にはこういうことが書いてあるのです。

PHP 開始タグを含めてはいけません。つまり、 '<? echo "Hi!"; >' ではなく 'echo "Hi!";' を渡さなければならないということです。 適切に PHP タグを使えば、PHP モードからいったん抜けてもう一度 PHP モードに戻るということも可能です。 たとえば、このようになります。 'echo "PHP モード!"; ?>HTML モード!<? echo "ふたたび PHP モード!";'

PHPの終了タグはもともと省略できる(PHP ManualのPHPタグの項では 「ファイル全体が純粋な PHP コードである場合は、ファイルの最後の終了タグは省略するのがおすすめ」 とさえ言っている)ので、それを踏まえてみるとPHPのeval()ってコードの直前に単純にPHPの開始タグ付けてPHP再実行したような手抜き感(?)が見えなくもないのですが…なのでPHPタグで囲われた文字列をeval()で評価したい場合は eval('?>' . $code); でいけます。開始タグがついているかどうかわからない場合は eval(preg_replace('/\A\s*<\?php/', '', $code, 1)); でいいのかなと思います。どういうものが入っているかわからないところから引っ張ってきた文字列をeval()するのは避けたほうがいいですけど…