4

と の間に機能上の違いはif(!empty($x))ありif(@$x)ますか?

NB は@エラーを抑制していることを認識しており、軽々しく使用していません。

4

3 に答える 3

2

一連のテストを実行したところ、これらの結果が返ってきました。

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
于 2013-10-02T22:37:36.137 に答える
2

他の人が指摘しているように、機能的な違いはないかもしれませんが、使用するif(@$x)のは正しくないようで、使用しない理由があります。

抑制エラー operatorに関するドキュメントから:

set_error_handler() でカスタム エラー ハンドラー関数を設定した場合、それは引き続き呼び出されますが、このカスタム エラー ハンドラーは error_reporting() を呼び出すことができます (そして呼び出す必要があります)。 .

同じページからの 1 つのコメントで、誰かが次のように書いています。

@ 記号が実際に何をするものなのか混乱しましたが、いくつかの実験の結果、次のように結論付けられました。

  • エラー報告がどのレベルに設定されているか、またはステートメントの前に @ が付いているかどうかに関係なく、設定されているエラー ハンドラが呼び出されます。

  • さまざまなエラー レベルに何らかの意味を与えるのは、エラー ハンドラ次第です。エラー報告が NONE に設定されている場合でも、カスタム エラー ハンドラーをすべてのエラーをエコーするようにすることができます。

  • では、@ 演算子は何をするのでしょうか? その行のエラー報告レベルを一時的に 0 に設定します。その行でエラーが発生した場合、エラー ハンドラは引き続き呼び出されますが、エラー レベル 0 で呼び出されます。

これが誰かを助けることを願っています

つまり、違いは見られないかもしれませんが、 issetemptyif(@$x)の代わりに使用すると、舞台裏で余分な作業が行われます。これは、エラーを抑制しても、常にエラー ハンドラが呼び出されるためです。

于 2013-10-02T23:18:48.717 に答える
1

これについて非常に興味がありました。私が実行したいくつかのテストの結果は、まったく逸脱していませんでした。

形式のテスト:

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
于 2013-10-02T22:52:55.473 に答える