1

PHP では、関数の先頭に @ を使用して、特定の関数のエラー レポートを無効にすることができます。

エラー制御演算子

PHP がサポートするエラー制御演算子は、アットマーク (@) の 1 つです。PHP で式の先頭に追加すると、その式によって生成される可能性のあるエラー メッセージは無視されます。

例えば:

@mail(...)

エラーが発生した場合でもエラーを返しませんが、それは悪い習慣ですか? なぜ?

4

4 に答える 4

5

はい、それは悪い習慣です。これは主に、エラーを単に抑制するのではなく、発生したエラーを表面化して修正する必要がある場合に、コードが機能せず、理由がわからないときに驚かされる、怠惰なコード記述を可能にするためです。

于 2013-07-30T00:33:41.220 に答える
2

プログラムを作成する方法は、エラーを隠すのではなく、エラーを処理する必要があります。関数によってエラーが発生する可能性がある場合は、それを処理するようにコーディングする必要があります。これが例です。

$myarray という配列があり、それをループ処理したいとします。

foreach($myarray as $value) {
    print $value;
}

$myarray の存在が条件付き (つまり、データベースから取得されたデータから作成されたもの) である場合、$myarray は変数ではないため、foreach() ループは失敗します。その状況に対処するために、上記のループを次のように記述します。

if(isset($myarray) && is_array($myarray)) {
    foreach($myarray as $value) {
        print $value;
    }
}

これにより、ループを実行する前に配列が実際に存在することが確認されます。このように、 foreach() はこの理由でエラーをスローできず、エラーを抑制する必要はありませんでした。

コードの設計では、潜在的なエラーを回避する必要があります。避けられないエラーをキャッチして、ギークではない有用なメッセージをユーザーに表示して、ユーザーがエラーへの対応方法を理解できるようにする必要があります。または、プログラムがエラーを回避し、タスクを静かに実行できる場合は、それを実行する必要があります。

mail() の場合、エラーをスローする場合、なぜそれを行うのでしょうか? メールを別の方法で送信するか、後で配信するためにキューに入れるか、またはその他のオプションなど、緊急事態を作成する必要がありますか? エラーを抑制したくない、それを処理したい。

于 2013-07-30T00:37:16.420 に答える
1

ええ、それは悪い習慣です。たとえば、ユーザーがあなたのサイトに登録したい場合、アクティベーション リンクまたは重要なものをメールで送信します。を使用しています@mailが、内部エラー(メールサーバーダウン)などでメールが送信できません。メールが送信されなかったことをユーザーが知ることはありますか? いいえ、でエラーを抑制した@か、エラーを処理せずにユーザーに通知したためです。

于 2013-07-30T00:32:56.000 に答える
0

@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!"); ?>

これにより、インクルードされたファイルに対してもエラー報告レベルがゼロに設定されます。そのため、含まれているファイルにエラーがある場合、それらは表示されません。

最後に、特定の機能だけでなく、すべてのアプリケーションのエラー処理を集中管理できます。

于 2013-07-30T01:39:33.983 に答える