1

アットマークは、エラーメッセージを非表示にするために使用されます。私の知る限り、それを使用するためのユースケースや言い訳はまったくありません。

  1. ログファイルにエラーを出力しながら、php ini設定を変更することで、本番環境でエラーを非表示にできます。
  2. @-signは、他のプログラマーが問題の場所を特定するのを困難にします
  3. エラーメッセージは、開発中の友達です。エラーをすばやく見つけて修正します

私の友人は、ソフトウェアが1つのシステムで動作し、別のシステムでは動作しない理由を調べるために2、3時間を費やしました。ライブラリ開発者が@-signを使用しなかった場合、これには約10秒かかります。

@-signにはまったく価値がないと言ったとき、私は心を閉ざしていますか?有効なケースはありますか?

4

6 に答える 6

4

@記号にはある程度の価値がありますが、通常はコードの臭いです。

次のことを考慮してください。複数のプロジェクトと互換性がある必要があるライブラリを開発していて、エラーハンドラをグローバルに変更したくない場合。残念ながら、多くのPHP関数(ソケットおよびストリーム関連の関数を含む)は、失敗時に例外ではなくPHPエラーをスローします。「@」記号は、エラーが手動でチェックされ、エラーが発生した場合に例外がスローされる場合にのみ、エラーを非表示にするのに役立ちます。

ファイルシステムの操作にも役立ちます。
主にあなたは正しいです...それは通常ひどい習慣です(:

于 2012-08-21T11:35:55.217 に答える
3

エラー抑制を使用することが実際に理にかなっているいくつかのまれな状況があります。

それらの1つは、アトミックファイルシステム操作です。例:書く代わりに

if (file_exists($fileName)) {
    unlink($fileName);
}

あなたはただする

@unlink($fileName);

これにより、コードが競合状態の影響を受けないようになります。

一般に、 PHPが関数に不適切なエラーモデルを選択@した場合に役立ちます。上記の関数はそのような例の1つです。同様に、PHPがエラーをスローするべきではないにもかかわらず、エラーをスローする他の関数があります(代わりに戻り値またはキャッチ可能な例外を使用します)。unlink

于 2012-08-21T11:36:17.200 に答える
1

ほとんどの場合、実際には使用しないでください。ただし、それが理にかなっている場合もあります。

  • unlink()
  • while (@ob_end_flush());

他にもいくつかのエッジケースがあるかもしれませんが、これら以外に、エラーを抑制してはいけません。

于 2012-08-21T11:36:03.690 に答える
0

利用可能なすべてのツール(プログラミングとその外部の両方)と同様に、すべてに正当なユースケースがあります。

エラー抑制演算子で頭に浮かぶ最初の例は、次のようになります。

if (!@unlink($file)) {
    // I am already handling the error. I don't care what caused it.
    // Even NOT handling this case at all could be a legitimate reaction
    // depending on circumstances.
}
于 2012-08-21T11:36:16.780 に答える
0
  • を使用するDOMDocumentと、無効なHTMLは警告をスローしますが、ほとんどの場合は気にしません。
  • PEARを使用するMailと、静的に呼び出すべきではない関数に関する警告が表示Mailされます。これは、PHP4をサポートしているためです。これらは無視しても問題ありません。
  • を使用する場合unlink()、競合状態を防ぐためにエラーを抑制します。
于 2012-08-21T11:36:34.733 に答える
0

私が見た中で最も一般的な場所は、dbを操作するときにmysqlエラーを抑制するためのものです。次に、ユーザーは代わりに応答を確認し、適切なエラーメッセージを出力します。

<?php
$link = @mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
    die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
mysql_close($link);
?>

また、ftpsやsftpsを操作するときに使用されることもあります。

しかし、私はその使用が制限されていると思うことに同意します。自分で作成したコードで@記号を使用する必要があると感じた場合は、解決策を再考するときが来たと思います。

于 2012-08-21T11:39:45.047 に答える