“!==”和“==!”之间的区别
昨天我在修改别人写的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) }