昨日、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を試してみましたが、リテラル文字列を検索する代わりに解釈しようとしていると思われます) )。誰もこれを以前に見たことがあり、この行動に光を当てることができますか?
違いは、演算子==!
がないことです。
この式:
$a ==! $b
基本的にこれと同じです:
$a == (!$b)
==!
演算子はありません==
と!
の単なる組み合わせです。ここに存在する関連演算子のみが==
です。したがって、==!
の組み合わせは、通常の==
と同様に機能し、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)
複数の演算子文字を結合すると、常に演算子として機能しない場合があります。たとえば、=
と!
を使用する場合、!=
または!==
のパターンの場合にのみ演算子として機能します。 !====
、!==!
などなど、これらの文字には多くの組み合わせがあります。演算子の組み合わせは、一意の形式である必要があります、ユニークな順序、ユニークな組み合わせ(すべての文字がすべてと結合しない他の文字)と間違いなく、それらの間にスペースなし。
以下の演算子リストを確認してください。
_==!
_は演算子ではなく2つです:
_==
_および_!
_
_!
_は、_==
_より高い優先度を持っています
そう :
"a" !== " ": bool(true)
-> trueは、「a」が実際には「」と等しくないためです。
"a" ==! " ": bool(false)
-> falseは、「a」が「!」に等しくないためです
==と!の間にスペースを入れて記述できます。
==!
はそのように存在しません。 == !
のやや不可解な表記です
これらの操作ではスペースは重要ではないので、a --> b
に評価されるが奇妙に見えるa-- > b
を簡単に記述できます。
そのため、質問に関しては:"a" ==! " "
は"a" == !" "
に解析されます。文字列の否定は casting でカバーされ、"0"
と" "
以外の文字列はキャスト時にtrue
になります。
したがって、式"a" == !" "
は転送されます。
"a" == !" "
"a" == !false
"a" == true
また、string "a"
はbool true
と同じではないため、式全体をfalse
に評価します。
だから、物語の教訓は何ですか?配置されていないスペースや間違ったスペースに戸惑うことはありません! :)
==!
は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)
}