私はPHPのeval関数を使用しようとしています。 しかし、私は解析エラーを処理するには固執しています。私は、エラー解析与えた場合、私は1 ..または1 ++ のようなエッジケースを持っている場合、考慮のような は:構文エラーを、.....PHPでeval関数の解析エラーを処理する方法
誰もが構文エラーを処理する方法や、エラーメッセージを回避する方法を知っていますか? より良いエラーメッセージを出したい。
変数にエラーメッセージを格納することもできますか? manualから
TIA
私はPHPのeval関数を使用しようとしています。 しかし、私は解析エラーを処理するには固執しています。私は、エラー解析与えた場合、私は1 ..または1 ++ のようなエッジケースを持っている場合、考慮のような は:構文エラーを、.....PHPでeval関数の解析エラーを処理する方法
誰もが構文エラーを処理する方法や、エラーメッセージを回避する方法を知っていますか? より良いエラーメッセージを出したい。
変数にエラーメッセージを格納することもできますか? manualから
TIA
:
If there is a parse error in the evaluated code,
eval()
returnsFALSE
and execution of the following code continues normally. It is not possible to catch a parse error ineval()
usingset_error_handler()
.
しかし、あなたが任意のコードにeval
を呼び出すことはありませんよう(?右)、これが問題になることはありません。 manual
As of PHP 7, if there is a parse error in the evaluated code,
eval()
throws aParseError
exception. Before PHP 7, in this caseeval()
returnedFALSE
and execution of the following code continued normally. It is not possible to catch a parse error ineval()
usingset_error_handler()
.
から
はい、preg_matchを使って検証しました。しかし、エラーメッセージを変更する方法はありますか? – ordinaryman09
@ ordinaryman09: 'preg_match'を使って任意のPHPコード(AFAIK)を検証することはできません。あなたが「エッジケース」を持っているという事実は、それを実証しています。 –
はい、完全ではないので、適切なエラーメッセージを表示するだけでエッジケースを処理する必要があります。 – ordinaryman09
$response = @eval($string);
if (error_get_last()){
echo 'Show your custom error message';
//Or you can
print_r(error_get_last());
}
それを見つけようとした30分後にしか、私はこれを見つけ出しませんでしたが、実際にエラーをキャッチするのに役立ちました。私の防衛では、これは私のコードではなかった。私は他の誰かを修正していたし、彼らはスタイルの外に行っていたように評価を使用しました! – CWSpear
'error_get_last()'は実際にはこのように動作しません。実際には、evalされた文字列の外であっても、すべてのスクリプトに全くエラーがない場合にのみnullを返します。 '@trigger_error( 'MY_LAST_ERROR');'のように自分自身を引き起こして最後のエラーを上書きし、 'error_get_last'で返された配列のメッセージが' 'MY_LAST_ERROR''であるかどうかを確認できます。現在 'set_error_handler'は' false'を返します。 – Ando
は、代わりにこれを使用する:
<?php
try {
eval('will cause error');
} catch (ParseError $e) {
echo 'Caught exception: '.$e->getMessage()."\n";
}
なぜ地獄あなたは明らかにあなたによって書かれていませんでしたコードに 'eval'を使用していますか? – ThiefMaster
サーバ側でevalを使用するよりも、クライアント側でもより良い方法が必要です。 – Ryan
これはプロジェクトの仕様であり、現実の目的では使用されません。 – ordinaryman09