web-dev-qa-db-ja.com

PHPで「@」プレフィックスは何をしますか?

次のコードで「@」記号は何をしますか?

@mkdir(ROOT. "cache/");
32
Rich Turner

エラーの表示を抑制します

PHPは、アットマーク(@)という1つのエラー制御演算子をサポートしています。 PHPの式の前に付けると、その式によって生成される可能性のあるエラーメッセージはすべて無視されます。

Track_errors機能が有効になっている場合、式によって生成されたエラーメッセージはすべて変数$ php_errormsgに保存されます。この変数はエラーごとに上書きされるため、使用する場合は早めに確認してください。

コメントに記載されているように、私もこの機能を実際に使用する理由を想像することはできません。エラーの状態/状態を適切に処理するコードを記述してください。

40
Mark Elliot

指摘したように、それはエラー抑制演算子です。

しかし、指摘されていないのは、使用することは非常に悪い習慣であるということです-エラーは黙って失敗するべきではありません。

エラーが返されるかどうかを確認し、例外が使用されている場合はtry/catchブロックを使用します。

特定の例では...

_@mkdir(ROOT. "cache/");
_

... mkdir()からのエラーはすべて無視されます。 docs は、失敗するとFALSEを返すと言っているので、次のことを行う必要があります...

_if ( ! mkdir(ROOT. "cache/")) {
   // Handle error.
}
_
8
alex

人々はPHPが物事を成し遂げるための手っ取り早い汚い言語であったことを忘れているようですが、最近になってようやく成熟して洗練されようとしました。

エラー抑制は、関数を必要な方法で動作させるための迅速で汚い方法です。Web開発では、何がスローされるかを予測できず、気にする価値がない場合もあるからです。

古典的な例は、誰かがアップロードした画像に関する情報を取得できる便利な関数getimagesizeです。この機能は、画像ファイルが標準の画像ファイルでない場合、ぐらつきます。ファイルを検査し、getimagesizeにロードできるかどうかを判断するのは、実際には開発者の役割ではありません。これを行うエレガントな方法があるかもしれませんが、真剣に私は気にしません!

これを行うだけです:

if( !($a = @getimagesize(  $_FILE['file']['tmp_name'] )))
{
   unlink( $_FILE['file']['tmp_name'] );

   //politely tell user that you rejected their image!
}

はい、よりエレガントなtryおよびcatchステートメントを使用できますが、最終的にはエラーをキャッチし、エラーメッセージを抑制しました。これは、タブキーを使い果たすことなく必要なものです。

上記の回答に反して、注意深く使用された@プレフィックスは、暴走する列車の大破にはなりません。これにより、開発者は好みの方法でエラーに対応できます。

5
Gordon Rouse