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

时间:2012-09-07 07:11:03

标签: php comparison operators comparison-operators

昨天我在修改其他人编写的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,但我怀疑他们试图解释它而不是搜索文字字符串)。有没有人以前见过这个并且可以解释这种行为?

5 个答案:

答案 0 :(得分:242)

不同之处在于没有运算符==!

这个表达式:

$a ==! $b

与此基本相同:

$a == (!$b)

答案 1 :(得分: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)

组合多个运算符字符可能无法始终作为运算符使用。例如,如果我们选择=!,只有在!=!==模式下,它才会作为运算符使用。这些字符可以有多种组合,例如!====!==!等等。运营商组合应采用唯一格式唯一顺序独特的组合(所有角色都不会与所有其他角色合并),绝对是,它们之间没有任何空格

检查下面的运营商列表;

enter image description here

答案 2 :(得分:38)

==!不是运营商,而是两个:

==!

!的优先级高于==

所以:

"a" !== " ": bool(true) - &gt;是的,因为“a”实际上不等于“”

"a" ==! " ": bool(false) - &gt;是的,因为“a”不等于!“”

可以用==和!之间的空格写。

答案 3 :(得分:29)

==!不存在。这是一个有点神秘的== !

符号

由于空格在这些操作中无关紧要,您可以轻松编写a --> b,其评估为a-- > b,但看起来很奇怪。

因此,关于问题:"a" ==! " "将被解析为"a" == !" "casting涵盖了字符串的否定,这意味着除"0"" "之外的所有字符串在投放时都是true

因此,表达式"a" == !" "将被转移:

  1. "a" == !" "
  2. "a" == !false
  3. "a" == true
  4. 并且,由于string "a"bool true不同,因此会将整个表达式评估为false

    那么,这个故事的寓意是什么?不要因丢失或错误的放置空间而让自己感到困惑! :)

答案 4 :(得分: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)
}