場合によっては、isset()
関数を使用する代わりに@
文字を使用できますか? そうでない場合は、どうしてですか?PHPでは@ issetの代わりに@を使用しています
多くの場合、複数の引用符、角括弧、およびドットを保存できるので、私はこれを使いたいと思います。
場合によっては、isset()
関数を使用する代わりに@
文字を使用できますか? そうでない場合は、どうしてですか?PHPでは@ issetの代わりに@を使用しています
多くの場合、複数の引用符、角括弧、およびドットを保存できるので、私はこれを使いたいと思います。
@
と言うとき、あなたはerror suppression operatorと話していると思いますが、それはisset()
の代わりではありません。
isset()
は、ある変数がプログラム内に既に存在するかどうかを判断し、その変数を使用するのが安全かどうかを判断するために使用されます。
あなたがしていると思われることは、その存在にかかわらず変数を使用しようとしていますが、それに起因する可能性のあるエラーを抑えることです。行の先頭にある@
演算子を使用すると、PHPはエラーを無視し、それを報告しないように指示します。
@
オペレータは、「一時的にerror_reporting(0)
をこの式に設定する」の略です。 isset()
は完全に異なる構築物です。 http://php.net/manual/en/language.operators.errorcontrol.php
しかし、それが指摘されていますように、エラーが発生した場合、コードは測定可能実行速度は低下します:ここで指摘したように
私が知る限り、@
はisset()
の代わりになりません。スクリプトにエラーがある場合にエラーを表示しないようにするエラー抑制演算子です。また、PHPコードで使用するとかなり悪い習慣です。
@
は使用しないでください。 @
は、警告を抑制します。これはコードが正しいことを意味するものではなく、設定に応じて警告がログファイルに追加される可能性があります。チェックを行うには、isset
を使用する方がはるかに良いです。
それ技術的に作品が、私は仮定し、出力を作成するときに、私は明示的なisset
ソリューションを好む、いくつかの理由が、ありますが、あなたがやっていることです:私は新しい開発者です場合
isset
イディオムを認識します。私はあなたがしようとしていることを知っています。 @
では、あなたの意図を把握するのは簡単ではありません。$user->name
のように、オブジェクトのプロパティが設定されているかどうかを確認したいとします。エラー抑制を使用してname
が設定されている場合は、$user
が未定義の場合は通知されません。代わりにisset($user->name)
を実行して明示的に実行すると、$user
が定義されていないと、エラーが通知されます。あなたのやりたいことによって異なります。たとえば、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");
}
@
オペレータはまた、より遅いあなたのコードの実行を行います。ここで説明したようにその場合は、代わりに@
オペレータのISSETを使用してコードは、はるかに高速です: http://seanmonstar.com/post/909029460/php-error-suppression-performance
ありがとうございます!私は悪い習慣を変えようとします。 :) – szatti1489
うわー、私は私の最初の投票を得た。恥ずかしがり屋ではない、誰でもそれを棄権した、私はあなたの理由を聞きたい。 「@演算子はまた、あなたのコードを遅くする」と書いています。私はもう一つ理由を挙げていましたが、既に与えられた他のすべての理由と矛盾しません。 – yitwail
私はdownvoteを認めてうれしいです。答えは嫌がらせです。これは減速につながるエラー抑制ではなく、通知/エラーの引き金となります。 '@()'の振る舞いは、プロファイラの中ではほんのわずかしかないことになります。とにかく、あなたはそれをコメントしたはずです。彼らはdownvotedすることはできませんし、それは[one-liner](http://stackoverflow.com/privileges/comment)なので、 – mario
いない他の理由のための場合は、はこのためにISSETの代用として、@を使用しないでください:
このコードではルック:$テストは'something'
です
echo (@$test) ?: 'default';
ならば、あなたは'something'
を取得します。
$ testが空の場合、null
、または存在しない場合、'default'
が得られます。問題の出番
は今ここにあります:
は'0'
またはFALSE
が有効な回答をしていると仮定しますか?
$ testが'0'
またはFALSE
の場合、'default'
は、'0'
になります。
echo (isset($test)) ? $test : 'default';
をあまり多くの符号化、およびより信頼性の高い、それはブール偽として評価できる引数を扱うことになると:
長い形式の三元は、あなたが使うべきものです。
Meh。私は、一時的なデバッグ行が良い習慣に従う必要はないということにすべて同意できます:P – Matchu