説明
mixed eval(string $code
)
評価されるコードは、eval がコールされた行における
変数のスコープ
を継承します。コールされた時点で利用可能なあらゆる変数が、
評価されるコード中で読み取ることができますし、変更することもできます。
しかし、定義されている全ての関数やクラスは、グローバル名前空間で定義されます。
言い換えると、コンパイラは評価されるコードを
include された別のファイルのようにみなすということです。
警告
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)に保存することが可能です。
注意:
評価されるコードの中で致命的なエラーが発生した場合は、
スクリプト全体が終了します。