PHP

PHP の `eval()` の HTML モードと PHP モード切り替え時の罠

PHP の eval() は評価させる文字列内で HTML モードと PHP モードを切り替えることができます。 evalに渡された文字列は ?> 以降から HTML モードとして解釈され、再び <?php が出てきたらその後ろの文字列は PHP として解釈されます。しかし、 <?php の後ろが文字列の終端だとその <?php は HTML として解釈されます。

<?php がPHPモードに切り替わらない

hoge.php
eval('echo "hoge"; ?> hoge <?php');
hoge.phpの出力
hoge hoge <?php

後ろに何かついているとPHPモードに切り替わる

fuga.php
eval('echo "fuga"; ?> fuga <?php echo "fuga";');
fuga.phpの出力
fuga fuga fuga

空白がある場合もPHPモードに切り替わる

bar.php
eval('echo "bar"; ?> bar <?php ');
bar.phpの出力
bar bar 

<?php だけだとそもそもPHPとして正しくない

末尾に改行を含まない
echo -n "<?php" > index.php
php index.php #=> "<?php" が出力される
末尾に改行を含む
echo "<?php" > index.php
php index.php #=> なにも出力されない

それはさておき、渡すコードは PHP として有効な形式でなければなりません。

http://php.net/manual/ja/function.eval.php