Вчера я наткнулся на это, когда модифицировал 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) }