eval
文字列を PHP コードとして評価する
&reftitle.description;
mixedeval
stringcode
指定した code
を PHP コードとして評価します。
評価されるコードは、eval がコールされた行における
変数のスコープ
を継承します。コールされた時点で利用可能なあらゆる変数が、
評価されるコード中で読み取ることができますし、変更することもできます。
しかし、定義されている全ての関数やクラスは、グローバル名前空間で定義されます。
言い換えると、コンパイラは評価されるコードを
include された別のファイルのようにみなすということです。
eval は非常に危険な言語構造です。
というのも、任意の PHP コードを実行できてしまうからです。
これを使うことはおすすめしません。
いろいろ検討した結果どうしても使わざるを得なくなった場合は、細心の注意を払って使いましょう。
ユーザーから受け取ったデータをそのまま渡してはいけません。
渡す前に、適切な検証が必要です。
&reftitle.parameters;
code
有効な PHP コード。これを評価します。
PHP
開始タグを含めてはいけません。つまり、
'<?php echo "Hi!"; ?>' ではなく
'echo "Hi!";' を渡さなければならないということです。
適切に PHP タグを使えば、PHP モードからいったん抜けてもう一度 PHP モードに戻るということも可能です。
たとえば、このようになります。
'echo "PHP モード!"; ?>HTML モード!<?php echo "ふたたび PHP モード!";'
それはさておき、渡すコードは PHP として有効な形式でなければなりません。
つまり、すべての文はセミコロンで終了する必要があるということです。
たとえば 'echo "やあ!"' はパースエラーになりますが、
'echo "やあ!";' は動作します。
return 文は、コードの評価をただちに終了します。
コードの実行は、eval を呼び出したスコープ内で行われます。
したがって、eval の中で定義したり変更したりした変数は
eval を抜けた後でも参照可能です。
&reftitle.returnvalues;
評価されるコードの中で return が
コールされない限り、eval は &null; を返します。
return がコールされた場合は、その値を返します。
PHP 7 以降、評価されるコードの中でパースエラーが発生した場合は、
eval は ParseError 例外をスローします。
PHP 7 より前のバージョンでは、この場合に
eval は &false; を返していました。
それ以降のコードは通常通り実行されます。
eval の中でのパースエラーを
set_error_handler
で捕捉することはできません。
&reftitle.examples;
eval の例 - 簡単なテキストのマージ
]]>
&example.outputs;
&reftitle.notes;
¬e.language-construct;
&tip.ob-capture;
評価されるコードの中で致命的なエラーが発生した場合は、
スクリプト全体が終了します。
&reftitle.seealso;
call_user_func