163

昨日、他の誰かが書いたPHPコードを変更したときに、これに遭遇しました。単純な比較(if ($var ==! " "))が期待どおりに機能しないことに戸惑いました。いくつかのテストの後、私はそのコードを書いた人が比較演算子として==!ではなく使用されていることに気づきました。!==私は==!どの言語でも見たことがないので、このコードがどのように機能するのか疑問に思い、いくつかのテストを行いました。

<?php
echo "int\n";
echo "1 !== 0: "; var_dump(1 !== 0);
echo "1 !== 1: "; var_dump(1 !== 1);
echo "1 ==! 0: "; var_dump(1 ==! 0);
echo "1 ==! 1: "; var_dump(1 ==! 1);
echo "bool\n";
echo "true !== false: "; var_dump(true !== false);
echo "true !== true: "; var_dump(true !== true);
echo "true ==! false: "; var_dump(true ==! false);
echo "true ==! true: "; var_dump(true ==! true);
echo "string\n";
echo '"a" !== " ": '; var_dump("a" !== " ");
echo '"a" !== "a": '; var_dump("a" !== "a");
echo '"a" ==! " ": '; var_dump("a" ==! " ");
echo '"a" ==! "a": '; var_dump("a" ==! "a");
?>

これにより、次の出力が生成されます。

int
1 !== 0: bool(true)
1 !== 1: bool(false)
1 ==! 0: bool(true)
1 ==! 1: bool(false)
bool
true !== false: bool(true)
true !== true: bool(false)
true ==! false: bool(true)
true ==! true: bool(false)
string
"a" !== " ": bool(true)
"a" !== "a": bool(false)
"a" ==! " ": bool(false)
"a" ==! "a": bool(false)

演算子はブール変数と整数変数では機能するようですが、文字列では機能しません。PHPのドキュメントなど、どの検索エンジンでも見つかりません==!(Google、Bing、DuckDuckGoを試しましたが、リテラル文字列を検索する代わりに、PHPのドキュメントを解釈しようとしていると思われます)。誰かがこれを以前に見たことがあり、この行動に光を当てることができますか?

4

5 に答える 5

244

違いは、演算子がないことです==!

この式:

$a ==! $b

基本的にこれと同じです:

$a == (!$b)
于 2012-09-07T07:13:25.433 に答える
77

==!PHPには演算子はありません

==との組み合わせです!。ここに存在する関連する演算子のみがです==。したがって、この組み合わせ==!は通常どおりに機能==し、チェックしEqualityて、私を信頼します。

$variable_a ==! $variable_b 

に他なりません

$variable_a == (!$variable_b)

したがって;

"a" ==! " ": bool(false)
"a" ==! "a": bool(false) //is same as "a" == (!"a")

true ==! false: bool(true)
true ==! true: bool(false)

複数の演算子文字を組み合わせると、常に演算子として機能するとは限りません。たとえば、とをとる=と、または!のパターンにある場合にのみ演算子として機能します。これらの文字には、などのように多数の組み合わせがあり ます。演算子の組み合わせは、一意の形式一意の順序一意の組み合わせ(すべての文字が他のすべての文字と結合しない)で、間にスペースを入れないようにする必要があります!=!==!====!==!

以下の演算子リストを確認してください。

ここに画像の説明を入力してください

于 2012-09-07T07:19:31.557 に答える
38

==!は演算子ではなく2つです:

==!

!優先度が==

それで :

"a" !== " ": bool(true)->「a」は実際には「」と等しくないためtrue

"a" ==! " ": bool(false)-> "a"は! ""と等しくないため、false

==と!の間にスペースを入れて書くことができます。

于 2012-09-07T07:12:58.020 に答える
29

==!そのように存在しません。やや不可解な表記です== !

これらの操作ではスペースは重要ではないので、と同じように簡単に書くことができます。a --> bこれはと評価されa-- > bますが、奇妙に見えます。

だから、質問に関しては:"a" ==! " "に解析され"a" == !" "ます。文字列の否定は、キャストによってカバーされます。これは、任意の文字列を意味しますが"0"" "キャストされると、trueです。

したがって、式"a" == !" "は転送されます。

  1. "a" == !" "
  2. "a" == !false
  3. "a" == true

そして、とstring "a"同じではないのでbool true、これは式全体をに評価しfalseます。

それで、物語の教訓は何ですか?スペースの欠落や間違った配置に惑わされないでください。:)

于 2012-09-07T07:17:39.487 に答える
25

==!演算子ではありません

==!php比較演算子ではありません-と同じです== !(スペースに注意してください)

つまり

if ("a" !== " ") {
    // evaluates to true - "a" and " " are not equal
}

if ("a" == !" ") {
    // unreachable
} else {
    // evaluates to false - "a" is not equal to true (!" " evaluates to true)
}
于 2012-09-07T07:13:11.010 に答える