Разница между "! ==" и "==!"

Вчера я наткнулся на это, когда модифицировал 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, но я подозреваю, что они пытаются интерпретировать ее, а не искать буквальную строку). Кто-нибудь видел это раньше и может пролить свет на это поведение?

Ответ 1

Разница в том, что оператор ==! отсутствует.

Это выражение:

$a ==! $b

В основном это то же самое:

$a == (!$b)

Ответ 2

В PHP20 > нет оператора ==!

Его просто комбинация == и !. Здесь присутствует только соответствующий оператор ==. Таким образом, комбинация ==! будет работать как обычный ==, проверять 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

Ответ 3

==! не является оператором, а двумя:

== и !

! с более высоким приоритетом, чем ==

Итак:

"a" !== " ": bool(true) → true, потому что "a" действительно не равно ""

"a" ==! " ": bool(false) → false, потому что "a" не равно! ""

Может быть записано с пробелом между == и!.

Ответ 4

==! не существует как таковой. Это несколько загадочная нотация == !

Поскольку в этих операциях пробелы не имеют значения, вы можете так же легко написать a --> b, который оценивается как a-- > b, но будет выглядеть странно.

Итак, что касается вопроса: "a" ==! " " будет анализироваться на "a" == !" ". Отрицание строки покрывается casting, то есть любая строка, но "0" и " " есть при нажатии true.

Таким образом, выражение "a" == !" " будет передано:

  • "a" == !" "
  • "a" == !false
  • "a" == true

И, поскольку string "a" не совпадает с bool true, это оценивает все выражение в false.

Итак, какова мораль этой истории? Не позволяйте себе смущаться отсутствующими или неправильными местами!:)

Ответ 5

==! не является оператором

==! вообще не является оператором сравнения 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)
}