“!==”和“==!”之间的区别
昨天我在修改别人写的PHP代码的时候偶然发现了这个。 我很困惑,一个简单的比较( if ($var ==! " ")
)没有按预期工作。 经过一些testing,我意识到谁写的代码使用==!
而不是!==
作为比较运算符。 我从来没有见过==!
在任何语言,所以我想知道如何这个代码甚至可以工作,并做了一些testing:
<?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)
运算符似乎为布尔和整数variables,但不适用于string。 我找不到==!
在PHP文档或任何有关它的任何search引擎(尝试谷歌,必应,DuckDuckGo,但我怀疑他们试图解释它,而不是search文字string)。 有没有人看过这个,可以揭示这种行为?
不同的是没有操作符==!
。
这个expression式:
$a ==! $b
基本上是这样的:
$a == (!$b)
没有==!
运算符在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)
组合多个操作员字符可能不总是作为操作员工作。 例如,如果我们取=
和!
,只有在!=
或!==
的模式下才能作为运营商使用。 这些字符可以有很多组合,如!====
, !==!
等等。操作员组合应该是独特的格式 , 唯一的顺序 , 独特的组合 (所有的字符不会与所有其他字符结合),而且绝对没有任何空间 。
检查下面的操作员列表;
==!
不是运营商,而是两个:
==
和!
!
具有比==
更高的优先级
所以:
"a" !== " ": bool(true)
– > true,因为“a”实际上不等于“”
"a" ==! " ": bool(false)
"a" ==! " ": bool(false)
– > false,因为“a”不等于!“”
可以写在==和!之间的空格。
==!
不存在这样的。 这是一个有点神秘的符号== !
由于空格在这些操作中并不重要,所以可以简单地写a --> b
,它的计算结果是a-- > b
,但看起来很奇怪。
所以,至于这个问题: "a" ==! " "
"a" ==! " "
将被parsing为"a" == !" "
。 string否定被覆盖,意味着任何string,但是"0"
和" "
被铸造时是true
。
因此,expression式"a" == !" "
将被传送:
-
"a" == !" "
-
"a" == !false
-
"a" == true
而且,由于string "a"
与bool true
不一样,所以这个expression式将整个expression式评估为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) }