@
次のような特定の関数の前での使用を見てきました。
$fileHandle = @fopen($fileName, $writeAttributes);
この記号の用途は何ですか?
@
次のような特定の関数の前での使用を見てきました。
$fileHandle = @fopen($fileName, $writeAttributes);
この記号の用途は何ですか?
エラーメッセージを抑制します — PHP マニュアルのエラー制御演算子を参照してください。
エラーを抑制します。
マニュアルのエラー制御演算子を参照してください。
PHP がサポートするエラー制御演算子は、アットマーク (@) の 1 つです。PHP で式の先頭に追加すると、その式によって生成される可能性のあるエラー メッセージは無視されます。
set_error_handler()でカスタム エラー ハンドラー関数を設定した場合、それは引き続き呼び出されますが、このカスタム エラー ハンドラーはerror_reporting()を呼び出すことができます (そして呼び出す必要があります)。 ...
@
シンボルは、エラー制御演算子(別名「沈黙」または「シャットダウン」演算子) です。関連付けられた式によって生成されたエラー メッセージ (通知、警告、致命的など) を PHP に抑制させます。単項演算子と同じように機能します。たとえば、優先順位と結合性があります。以下にいくつかの例を示します。
@echo 1 / 0;
// generates "Parse error: syntax error, unexpected T_ECHO" since
// echo is not an expression
echo @(1 / 0);
// suppressed "Warning: Division by zero"
@$i / 0;
// suppressed "Notice: Undefined variable: i"
// displayed "Warning: Division by zero"
@($i / 0);
// suppressed "Notice: Undefined variable: i"
// suppressed "Warning: Division by zero"
$c = @$_POST["a"] + @$_POST["b"];
// suppressed "Notice: Undefined index: a"
// suppressed "Notice: Undefined index: b"
$c = @foobar();
echo "Script was not terminated";
// suppressed "Fatal error: Call to undefined function foobar()"
// however, PHP did not "ignore" the error and terminated the
// script because the error was "fatal"
標準の PHP エラー ハンドラーの代わりにカスタム エラー ハンドラーを使用すると、正確には次のようになります。
set_error_handler() でカスタム エラー ハンドラー関数を設定した場合、それは引き続き呼び出されますが、このカスタム エラー ハンドラーは error_reporting() を呼び出すことができます (そして呼び出す必要があります)。 .
これを次のコード例に示します。
function bad_error_handler($errno, $errstr, $errfile, $errline, $errcontext) {
echo "[bad_error_handler]: $errstr";
return true;
}
set_error_handler("bad_error_handler");
echo @(1 / 0);
// prints "[bad_error_handler]: Division by zero"
エラー ハンドラは、@
シンボルが有効かどうかをチェックしませんでした。マニュアルでは、次のことを提案しています。
function better_error_handler($errno, $errstr, $errfile, $errline, $errcontext) {
if(error_reporting() !== 0) {
echo "[better_error_handler]: $errstr";
}
// take appropriate action
return true;
}
また、エラーが非表示になっているにもかかわらず、カスタム エラー ハンドラ ( で設定set_error_handler
) は引き続き実行されることに注意してください。
以前に回答されたように、@
オペレーターは、通知、警告、さらには重大なエラーを含む、PHP のすべてのエラーを抑制します。
BUT: 演算子は絶対に使用しないでください。@
なんで?
エラー抑制のために演算子を使用する@
と、エラーが発生したときにどこから始めればよいかまったくわからないからです。私はすでに、一部の開発者が@
演算子を頻繁に使用するレガシー コードを「楽しんで」いました。特に、ファイル操作、ネットワーク呼び出しなどの場合です。多くの開発者が@
オペレーターの使用を推奨しているケースはすべて、ここでエラーが発生した場合 (たとえば、サードパーティ API に到達できないなど) は範囲外になることがあるためです。 )。
しかし、まだそれを使用しないことに何の意味がありますか? 次の 2 つの観点から見てみましょう。
開発者として:を使用する@
と、どこから始めればよいかまったくわかりません。@
エラーを伴う関数呼び出しが数百または数千ある場合、この場合、妥当なデバッグはできません。たとえそれがサードパーティのエラーであったとしても、問題はなく、迅速に作業を完了できます。;-) さらに、エラー ログに十分な詳細を追加することをお勧めします。これにより、開発者は、ログ エントリがさらにチェックする必要があるものなのか、開発者の範囲外のサード パーティの障害なのかを簡単に判断できます。
ユーザーとして:ユーザーは、エラーの理由が何であるかをまったく気にしません。ソフトウェアは、彼らが仕事をしたり、特定のタスクを完了したりするために存在します。彼らは、それが開発者のせいであろうとサードパーティの問題であろうと気にしません。特にユーザーには、範囲外であってもすべてのエラーをログに記録することを強くお勧めします。特定の API が頻繁にオフラインになっていることに気付くかもしれません。あなたは何ができますか?API パートナーと話すことができます。API パートナーが安定性を維持できない場合は、おそらく別のパートナーを探す必要があります。
要するに:@
(knowledge is always good) のようなものが存在することを知っておく必要がありますが、使用しないでください。多くの開発者 (特に他の開発者のコードをデバッグしている開発者) は非常に感謝しています。
「@」演算子を使用していないと仮定すると、コードは次のようになります。
$fileHandle = fopen($fileName, $writeAttributes);
開こうとしているファイルが見つからない場合はどうすればよいでしょうか。エラーメッセージが表示されます。
エラーメッセージを抑制するために、次のような「@」演算子を使用しています。
$fileHandle = @fopen($fileName, $writeAttributes);
オープンに失敗した場合、E_WARNING レベルのエラーが発生します。@ を使用して、この警告を抑制できます。
ここに追加する価値があるかもしれません。@ を使用する際に知っておくべきいくつかのポインターがあります。完全な概要については、この投稿をご覧ください: http://mstd.eu/index.php/2016/06/30/php-ラピッドファイア-php/で使用されるシンボルは何ですか
@ 記号が先頭に追加されていても、エラー ハンドラは引き続き起動されます。これは、エラー レベル 0 が設定されていることを意味するだけです。これは、カスタム エラー ハンドラで適切に処理する必要があります。
インクルードの先頭に @ を付けると、インクルード ファイル内のすべてのエラーがエラー レベル 0 に設定されます。