PHP では、関数の先頭に @ を使用して、特定の関数のエラー レポートを無効にすることができます。
PHP がサポートするエラー制御演算子は、アットマーク (@) の 1 つです。PHP で式の先頭に追加すると、その式によって生成される可能性のあるエラー メッセージは無視されます。
例えば:
@mail(...)
エラーが発生した場合でもエラーを返しませんが、それは悪い習慣ですか? なぜ?
PHP では、関数の先頭に @ を使用して、特定の関数のエラー レポートを無効にすることができます。
PHP がサポートするエラー制御演算子は、アットマーク (@) の 1 つです。PHP で式の先頭に追加すると、その式によって生成される可能性のあるエラー メッセージは無視されます。
例えば:
@mail(...)
エラーが発生した場合でもエラーを返しませんが、それは悪い習慣ですか? なぜ?
はい、それは悪い習慣です。これは主に、エラーを単に抑制するのではなく、発生したエラーを表面化して修正する必要がある場合に、コードが機能せず、理由がわからないときに驚かされる、怠惰なコード記述を可能にするためです。
プログラムを作成する方法は、エラーを隠すのではなく、エラーを処理する必要があります。関数によってエラーが発生する可能性がある場合は、それを処理するようにコーディングする必要があります。これが例です。
$myarray という配列があり、それをループ処理したいとします。
foreach($myarray as $value) {
print $value;
}
$myarray の存在が条件付き (つまり、データベースから取得されたデータから作成されたもの) である場合、$myarray は変数ではないため、foreach() ループは失敗します。その状況に対処するために、上記のループを次のように記述します。
if(isset($myarray) && is_array($myarray)) {
foreach($myarray as $value) {
print $value;
}
}
これにより、ループを実行する前に配列が実際に存在することが確認されます。このように、 foreach() はこの理由でエラーをスローできず、エラーを抑制する必要はありませんでした。
コードの設計では、潜在的なエラーを回避する必要があります。避けられないエラーをキャッチして、ギークではない有用なメッセージをユーザーに表示して、ユーザーがエラーへの対応方法を理解できるようにする必要があります。または、プログラムがエラーを回避し、タスクを静かに実行できる場合は、それを実行する必要があります。
mail() の場合、エラーをスローする場合、なぜそれを行うのでしょうか? メールを別の方法で送信するか、後で配信するためにキューに入れるか、またはその他のオプションなど、緊急事態を作成する必要がありますか? エラーを抑制したくない、それを処理したい。
ええ、それは悪い習慣です。たとえば、ユーザーがあなたのサイトに登録したい場合、アクティベーション リンクまたは重要なものをメールで送信します。を使用しています@mail
が、内部エラー(メールサーバーダウン)などでメールが送信できません。メールが送信されなかったことをユーザーが知ることはありますか? いいえ、でエラーを抑制した@
か、エラーを処理せずにユーザーに通知したためです。
@
PHP エラー制御演算子の使用が良くない理由はいくつかあります。
1- PHPマニュアルより
現在、"@" エラー制御演算子プレフィックスは、スクリプトの実行を終了させる重大なエラーのエラー レポートを無効にします。とりわけ、これは、「@」を使用して特定の関数からのエラーを抑制し、それが利用できないか、タイプミスされている場合、スクリプトは理由を示さずにその場で停止することを意味します。
@
2-たとえば、次のように使用した場合、非推奨の関数を引き続き使用できます。
if(eregi("a", "abc")) echo "a";
次のエラーが発生します。
Deprecated: Function eregi() is deprecated in D:\htdocs\test.php on line 2
使用中if(@eregi("a", "abc")) echo "a";
はメッセージを発行しません。
3- その他の事実:
http://us3.php.net/manual/en/language.operators.errorcontrol.php#99805
@ を使用すると非常に遅いことに注意してください。PHP は、この方法でエラーを抑制するためにオーバーヘッドが発生するためです。これは、速度と利便性のトレードオフです。
http://us3.php.net/manual/en/language.operators.errorcontrol.php#85042
エラー報告がどのレベルに設定されているか、またはステートメントの前に @ が付いているかどうかに関係なく、設定されているエラー ハンドラが呼び出されます。
さまざまなエラー レベルに何らかの意味を与えるのは、エラー ハンドラ次第です。エラー報告が NONE に設定されている場合でも、カスタム エラー ハンドラーをすべてのエラーをエコーするようにすることができます。
では、@ 演算子は何をするのでしょうか? その行のエラー報告レベルを一時的に 0 に設定します。その行でエラーが発生した場合、エラー ハンドラは引き続き呼び出されますが、エラー レベル 0 で呼び出されます。
http://us3.php.net/manual/en/language.operators.errorcontrol.php#94004
次のように include() の前にステートメントでエラー制御演算子を使用することに注意してください。
<?PHP (@include("file.php")) OR die("Could not find file.php!"); ?>
これにより、インクルードされたファイルに対してもエラー報告レベルがゼロに設定されます。そのため、含まれているファイルにエラーがある場合、それらは表示されません。
最後に、特定の機能だけでなく、すべてのアプリケーションのエラー処理を集中管理できます。