163

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

4

5 回答 5

244

不同的是没有运算符==!

这个表达式:

$a ==! $b

基本上和这个一样:

$a == (!$b)
于 2012-09-07T07:13:25.433 回答
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)

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

检查下面的运营商列表;

在此处输入图像描述

于 2012-09-07T07:19:31.557 回答
38

==!不是运算符,而是两个:

==!

!优先级高于==

所以 :

"a" !== " ": bool(true)--> true 因为“a”真的不等于“”

"a" ==! " ": bool(false)--> false 因为 "a" 不等于 !" "

可以写成 == 和 ! 之间有空格。

于 2012-09-07T07:12:58.020 回答
29

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

由于空格在这些操作中并不重要,因此您可以轻松编写a --> b,其计算结果为a-- > b,但看起来很奇怪。

所以,至于问题:"a" ==! " "将被解析为"a" == !" ". 字符串的否定被强制转换覆盖,这意味着任何字符串,但在强制转换时"0",是。" "true

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

  1. "a" == !" "
  2. "a" == !false
  3. "a" == true

并且,与string "a"不同bool true,这会将整个表达式计算为false

那么,这个故事的寓意是什么?不要让自己被丢失或错误放置的空间所迷惑!:)

于 2012-09-07T07:17:39.487 回答
25

==!不是操作员

==!根本不是 php 比较运算符 - 它与== !(注意空格)相同

IE

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)
}
于 2012-09-07T07:13:11.010 回答