(PHP 4, PHP 5, PHP 7, PHP 8)
eval — 文字列を PHP コードとして評価する
指定した code
を PHP コードとして評価します。
eval() は非常に危険な言語構造です。 というのも、任意の PHP コードを実行できてしまうからです。 これを使うことはおすすめしません。 いろいろ検討した結果どうしても使わざるを得なくなった場合は、細心の注意を払って使いましょう。 ユーザーから受け取ったデータをそのまま渡してはいけません。 渡す前に、適切な検証が必要です。
code
有効な PHP コード。これを評価します。
PHP
開始タグを含めてはいけません。つまり、
'<?php echo "Hi!"; ?>'
ではなく
'echo "Hi!";'
を渡さなければならないということです。
適切に PHP タグを使えば、PHP モードからいったん抜けてもう一度 PHP モードに戻るということも可能です。
たとえば、このようになります。
'echo "PHP モード!"; ?>HTML モード!<?php echo "ふたたび PHP モード!";'
それはさておき、渡すコードは PHP として有効な形式でなければなりません。
つまり、すべての文はセミコロンで終了する必要があるということです。
たとえば 'echo "やあ!"'
はパースエラーになりますが、
'echo "やあ!";'
は動作します。
return
文は、コードの評価をただちに終了します。
コードの実行は、eval() を呼び出したスコープ内で行われます。 したがって、eval() の中で定義したり変更したりした変数は eval() を抜けた後でも参照可能です。
評価されるコードの中で return
が
コールされない限り、eval() は null
を返します。
return
がコールされた場合は、その値を返します。
PHP 7 以降、評価されるコードの中でパースエラーが発生した場合は、
eval() は ParseError 例外をスローします。
PHP 7 より前のバージョンでは、この場合に
eval() は false
を返していました。
それ以降のコードは通常通り実行されます。
eval() の中でのパースエラーを
set_error_handler()
で捕捉することはできません。
例1 eval() の例 - 簡単なテキストのマージ
<?php
$string = 'cup';
$name = 'coffee';
$str = 'This is a $string with my $name in it.';
echo $str. "\n";
eval("\$str = \"$str\";");
echo $str. "\n";
?>
上の例の出力は以下となります。
This is a $string with my $name in it. This is a cup with my coffee in it.
ブラウザに直接結果を出力する すべてのものと同様に、出力制御関数 を使用してこの関数の出力をキャプチャーし、(例えば)文字列 (string)に保存することが可能です。
注意:
評価されるコードの中で致命的なエラーが発生した場合は、 スクリプト全体が終了します。