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

Вчера я наткнулся на это, когда модифицировал 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" == !" " Будет передано:

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