3

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

多くの場合、いくつかの引用符、角かっこ、ドットを保存できるので、これを使用するのが好きです。

4

7 に答える 7

6

文字と言うときはエラー抑制演算子について話していると思います@が、それは の代わりではありませんisset()

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

あなたがしていると思うのは、変数の存在に関係なく変数を使用しようとしていることですが、そこから発生する可能性のあるエラーを抑制しています。@行頭で演算子を使用すると、エラーを無視して報告しないように PHP に指示します。

この@演算子は、「error_reporting(0)この式に一時的に設定」の省略形です。isset()はまったく異なる構造です。

于 2011-07-28T22:39:51.603 に答える
1

だけを使用するべきではありません@。は@警告を抑制します。これはコードが正しいという意味ではなく、設定によっては警告がログ ファイルに追加される場合があります。issetチェックを行うために使用する方がはるかに優れています。

于 2011-07-28T22:35:42.913 に答える
0

As far as I know @ is no substitution for isset(). Its an error suppression operator which prevents displaying errors in case they do exist in the script. Its also a pretty bad habit if used in PHP code.

于 2011-07-28T22:34:53.150 に答える
0

他に理由がない場合は、@ を isset の代わりに使用しないでください。

このコードを見てください:

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

$test の場合は'something'、 が得られます'something'

$test が空の場合、nullまたは存在しない場合は、 ; が返されます'default'

ここで問題が発生します。

有効な答えだと思います'0'か?FALSE

$test が'0'orの場合、望みどおりにNOTFALSEが得られます。'default''0'

長い形式の 3 進数を使用する必要があります。

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

ブール値の false として評価される可能性のある引数を処理する場合、コーディングはそれほど多くなく、より信頼性が高くなります。

于 2013-11-15T16:38:11.237 に答える
0

技術的には機能しますが、出力を作成するときに明示的なソリューションを好む理由がいくつかありissetます。これは、あなたがしていることだと思います。

  1. 私があなたの古いコードに取り組んでいる新しい開発者であれば、issetイディオムを認識しています。私はあなたが何をしようとしているのか知っています。では@、意図を把握するのはそれほど簡単ではありません。
  2. のように、オブジェクトのプロパティが設定されているかどうかを確認したいとします$user->name。エラー抑制を使用して が設定されているかどうかを確認するだけでは、が定義されていnameない場合は通知されません。$user代わりに、が定義されていない場合にエラーが通知されるisset($user->name)ように、明示的に実行することをお勧めします。$user
  3. エラー抑制は全体的に悪い習慣です。エラー通知は良いものであり、できるだけ簡単にエラーを通知できるようにする必要があります。必要のないときにそれらを抑制すると、将来の問題につながります。
于 2011-07-28T22:38:49.823 に答える
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の回答もご覧ください。彼の言っていることが本当なら、あなたのログ ファイルにも、あなたが知らない警告が記録されている可能性があります。これにより、リリース後のデバッグ中にログ ファイルが役に立たなくなる可能性があります。

于 2011-07-28T22:39:16.860 に答える
-1

@ここで指摘されているように 、オペレーターはコードの実行を遅くします: http://php.net/manual/en/language.operators.errorcontrol.php

しかし、指摘されているように、エラーが発生した場合にのみ、コードの実行がかなり遅くなります。その場合、ここで説明されているように、演算子の代わりに isset を使用するコード@ははるかに高速です: http://seanmonstar.com/post/909029460/php-error-suppression-performance

于 2011-07-28T22:43:17.067 に答える