Вчера я наткнулся на это, когда модифицировал 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, но я подозреваю, что они пытаются интерпретировать ее, а не искать литералную строку). Кто-нибудь видел это раньше и может пролить свет на это поведение?
Разница в том, что нет оператора ==! ,
Это выражение:
$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" ==! " " будет обработан "a" == !" " . Отрицание строки покрывается литьем , означая любую строку, но "0" и " " при кастинге true .
Таким образом, выражение "a" == !" " Будет передано:
"a" == !" " "a" == !false "a" == true И, поскольку string "a" не совпадает с bool true , это оценивает все выражение в 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) }