“!==”和“==!”之间的区别

昨天我在修改别人写的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" == !" "将被传送:

  1. "a" == !" "
  2. "a" == !false
  3. "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) }