と の間に機能上の違いはif(!empty($x))
ありif(@$x)
ますか?
NB は@
エラーを抑制していることを認識しており、軽々しく使用していません。
一連のテストを実行したところ、これらの結果が返ってきました。
When $x="foo";
@$x == true
!empty($x) == true
isset($x) == true
When $x has not been set!
@$x == false
!empty($x) == false
isset($x) == false
別の x 値を持つ別のセットを次に示します。
When $x=0;
@$x == false
!empty($x) == false
isset($x) == true
そして再び1で。
When $x=1;
@$x == true
!empty($x) == true
isset($x) == true
他の人が指摘しているように、機能的な違いはないかもしれませんが、使用するif(@$x)
のは正しくないようで、使用しない理由があります。
抑制エラー operatorに関するドキュメントから:
set_error_handler() でカスタム エラー ハンドラー関数を設定した場合、それは引き続き呼び出されますが、このカスタム エラー ハンドラーは error_reporting() を呼び出すことができます (そして呼び出す必要があります)。 .
同じページからの 1 つのコメントで、誰かが次のように書いています。
@ 記号が実際に何をするものなのか混乱しましたが、いくつかの実験の結果、次のように結論付けられました。
エラー報告がどのレベルに設定されているか、またはステートメントの前に @ が付いているかどうかに関係なく、設定されているエラー ハンドラが呼び出されます。
さまざまなエラー レベルに何らかの意味を与えるのは、エラー ハンドラ次第です。エラー報告が NONE に設定されている場合でも、カスタム エラー ハンドラーをすべてのエラーをエコーするようにすることができます。
では、@ 演算子は何をするのでしょうか? その行のエラー報告レベルを一時的に 0 に設定します。その行でエラーが発生した場合、エラー ハンドラは引き続き呼び出されますが、エラー レベル 0 で呼び出されます。
これが誰かを助けることを願っています
つまり、違いは見られないかもしれませんが、 issetとemptyif(@$x)
の代わりに使用すると、舞台裏で余分な作業が行われます。これは、エラーを抑制しても、常にエラー ハンドラが呼び出されるためです。
これについて非常に興味がありました。私が実行したいくつかのテストの結果は、まったく逸脱していませんでした。
形式のテスト:
var_dump(!empty($x));
var_dump(!!@$x);
結果
$x is an empty array
boolean false
boolean false
$x is int(1)
boolean true
boolean true
$x is int(0)
boolean false
boolean false
$x is float(0.1)
boolean true
boolean true
$x is string(0)
boolean false
boolean false
$x is string(1)
boolean true
boolean true
$x is string(abc)
boolean true
boolean true
$x is instance of stdClass
boolean true
boolean true
$x is true
boolean true
boolean true
$x is false
boolean false
boolean false
$x is defined null
boolean false
boolean false
$x is not set
boolean false
boolean false