2011-07-28 18 views
3

場合によっては、isset()関数を使用する代わりに@文字を使用できますか? そうでない場合は、どうしてですか?PHPでは@ issetの代わりに@を使用しています

多くの場合、複数の引用符、角括弧、およびドットを保存できるので、私はこれを使いたいと思います。

答えて

6

@と言うとき、あなたはerror suppression operatorと話していると思いますが、それはisset()の代わりではありません。

isset()は、ある変数がプログラム内に既に存在するかどうかを判断し、その変数を使用するのが安全かどうかを判断するために使用されます。

あなたがしていると思われることは、その存在にかかわらず変数を使用しようとしていますが、それに起因する可能性のあるエラーを抑えることです。行の先頭にある@演算子を使用すると、PHPはエラーを無視し、それを報告しないように指示します。

@オペレータは、「一時的にerror_reporting(0)をこの式に設定する」の略です。 isset()は完全に異なる構築物です。 http://php.net/manual/en/language.operators.errorcontrol.php

しかし、それが指摘されていますように、エラーが発生した場合、コードは測定可能実行速度は低下します:ここで指摘したように

0

私が知る限り、@isset()の代わりになりません。スクリプトにエラーがある場合にエラーを表示しないようにするエラー抑制演算子です。また、PHPコードで使用するとかなり悪い習慣です。

1

@は使用しないでください。 @は、警告を抑制します。これはコードが正しいことを意味するものではなく、設定に応じて警告がログファイルに追加される可能性があります。チェックを行うには、issetを使用する方がはるかに良いです。

0

それ技術的に作品が、私は仮定し、出力を作成するときに、私は明示的なissetソリューションを好む、いくつかの理由が、ありますが、あなたがやっていることです:私は新しい開発者です場合

  1. をあなたの古いコードの作業、私はissetイディオムを認識します。私はあなたがしようとしていることを知っています。 @では、あなたの意図を把握するのは簡単ではありません。
  2. $user->nameのように、オブジェクトのプロパティが設定されているかどうかを確認したいとします。エラー抑制を使用してnameが設定されている場合は、$userが未定義の場合は通知されません。代わりにisset($user->name)を実行して明示的に実行すると、$userが定義されていないと、エラーが通知されます。
  3. エラー抑制は全体的に悪い習慣です。エラー通知はが良好であるため、エラーの通知をできるだけ簡単に行う必要があります。それが必要でないときにそれらを抑制することは、将来問題を引き起こす。
0

あなたのやりたいことによって異なります。たとえば、var_dump()やその他のデバッグを実行しているときに、値が設定されないことがあることがわかっている場合、この状況では大丈夫です。

var_dump(@$_REQUEST['sometimesIamSet']); 

あなたはこのような場合には、それを使用している場合:

if(@$_REQUEST['something']){ 
    // do something 
} 
else{ 
    // do something else 
} 

私は強くそれに対して助言します。あなたは、あなたがしたいことを明示的に行うためにコードを書くべきです。

if(isset($_REQUEST['something'])){ 
    // Hurray I know exactly what is going on! 
} 
else{ 
    // Not set! 
} 

あなたがあなた自身のエラーをスローしたいときに私は、@を使用して考えることができ、生産の唯一のインスタンスがあります。例も

$database_connection = @db_connect_function(); 

if($database_connection === false){ 
    throw new Exception("DB connection could not be made"); 
} 



について、PaulPROの答えを見てください。もし彼が言っていることが確かに真実ならば、あなたのログファイルはあなたが知らない警告を記録することもあります。これにより、リリース後のデバッグ中にログファイルの有用性が低下します。

+0

Meh。私は、一時的なデバッグ行が良い習慣に従う必要はないということにすべて同意できます:P – Matchu

-1

@オペレータはまた、より遅いあなたのコードの実行を行います。ここで説明したようにその場合は、代わりに@オペレータのISSETを使用してコードは、はるかに高速です: http://seanmonstar.com/post/909029460/php-error-suppression-performance

+0

ありがとうございます!私は悪い習慣を変えようとします。 :) – szatti1489

+0

うわー、私は私の最初の投票を得た。恥ずかしがり屋ではない、誰でもそれを棄権した、私はあなたの理由を聞きたい。 「@演算子はまた、あなたのコードを遅くする」と書いています。私はもう一つ理由を挙げていましたが、既に与えられた他のすべての理由と矛盾しません。 – yitwail

+0

私はdownvoteを認めてうれしいです。答えは嫌がらせです。これは減速につながるエラー抑制ではなく、通知/エラーの引き金となります。 '@()'の振る舞いは、プロファイラの中ではほんのわずかしかないことになります。とにかく、あなたはそれをコメントしたはずです。彼らはdownvotedすることはできませんし、それは[one-liner](http://stackoverflow.com/privileges/comment)なので、 – mario

0

いない他の理由のための場合は、はこのためにISSETの代用として、@を使用しないでください:

このコードでは

ルック:$テストは'something'です

echo (@$test) ?: 'default'; 

ならば、あなたは'something'を取得します。

$ testが空の場合、null、または存在しない場合、'default'が得られます。問題の出番

は今ここにあります:

'0'またはFALSEが有効な回答をしていると仮定しますか?

$ testが'0'またはFALSEの場合、'default'は、'0'になります。

echo (isset($test)) ? $test : 'default'; 

をあまり多くの符号化、およびより信頼性の高い、それはブール偽として評価できる引数を扱うことになると:

長い形式の三元は、あなたが使うべきものです。

関連する問題