このような致命的なエラーは、次のようなコードになります。
set_exception_handler(function ($e) {
echo "My exception handler";
restore_exception_handler();
throw new Exception("Throw this instead.");
});
throw new Exception("An exception");
またはこのように:
function destroy_handler() {
restore_exception_handler();
}
function update_handler() {
destroy_handler();
}
set_exception_handler(function ($e) {
echo "My exception handler";
update_handler();
throw new Exception("Throw this instead.");
});
throw new Exception("An exception");
例外がスローされると、指定されたコールバックset_exception_handler()
が実行され、 が呼び出されるとすぐに、restore_exception_handler()
そのクロージャーへの同じ参照が独自のスコープ内で破棄 (または再割り当て) されるため、致命的なエラーが発生します (in の例でも同じことが言えます) hanskrentel at yahoo dot de
。によって投稿されたリンクSameer K
)。
2 番目の例から、スコープがネストされていても同じことが起こることがわかります。これは、restore_exception_handler
が最後に設定された例外ハンドラを破棄するためであり、そのコピーではありません (変数に初期値を与える式をまだ評価している間に、変数を再割り当てしたり、設定を解除したりするようなものです)。
コードのエラーが別のファイルを指していると言った場合は、他のファイルの関数やメソッドで実行が「ジャンプ」するラムダのすべての呼び出しを確認し、参照を再割り当てまたは破棄しているかどうかを確認することをお勧めしますラムダ自体。