Вчера я наткнулся на это, когда изменил код 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, но я подозреваю, что они пытаются интерпретировать его вместо поиска буквальной строки). Кто-нибудь видел это раньше и может пролить свет на это поведение?
источник
Ответы:
Разница в том, что нет оператора
==!
.Это выражение:
В основном так же, как это:
источник
В
==!
PHP нет оператораЭто просто сочетание
==
и!
. Здесь присутствует только соответствующий оператор==
. Таким образом, комбинация==!
будет работать как обычно==
, проверяяEquality
, и поверьте мне,не кто иной, как
и поэтому;
И
Объединение нескольких операторов символов может работать не всегда как оператор. например, если мы возьмем
=
и!
, он будет работать как оператор, только если он в шаблоне!=
или!==
. Для этих символов может быть множество комбинаций, таких как!====
и!==!
т. Д. И т. Д. Комбинации операторов должны быть в уникальном формате , уникальном порядке , уникальных комбинациях (все символы не будут сочетаться со всеми остальными символами) и определенно без пробелов между ними .Проверьте список операторов ниже;
источник
<table>
.==!
это не оператор, а два:==
и!
!
имеющий более высокий приоритет, чем==
Так :
"a" !== " ": bool(true)
-> правда, потому что "а" действительно не равно """a" ==! " ": bool(false)
-> ложь, потому что "а" не равно! ""Может быть написано с пробелом между == и!
источник
false because "a" is not equals to !" "
! "" означает приведение к булу и отрицанию того, что "" верно и! "" ложно.==!
не существует как таковой. Это несколько загадочная запись== !
Поскольку пробелы в этих операциях не имеют значения, вы могли бы так же легко написать
a --> b
, что оцениваетсяa-- > b
, но будет выглядеть странно.Итак, что касается вопроса:
"a" ==! " "
будет разобрано до"a" == !" "
. Отрицание строки покрыто литьем , что означает любую строку , но"0"
и в" "
том, когда отливает,true
.Таким образом, выражение
"a" == !" "
будет передано:"a" == !" "
"a" == !false
"a" == true
И, как
string "a"
не то же самоеbool true
, это оценивает все выражение вfalse
.Итак, какова мораль этой истории? Не позволяйте себе быть смущенным пропущенными или неправильно размещенными пробелами! :)
источник
==! не оператор
==!
вовсе не оператор сравнения php - он такой же, как== !
(обратите внимание на пробел)Т.е.
источник