В чем разница между этими двумя утверждениями?
if (!$var === true) {
или же
if (!($var === true)) {
Я наткнулся на некоторый подобный код и пытался выяснить, как он используется.
Я понимаю, что условия внутри скобок оцениваются изнутри наружу.
Это связано с PHP Приоритет оператора.
!
оценивается до ===
является. Итак, в первом примере:
$var
true
Во втором примере вы используете скобки для принудительного ===
случиться первым. Итак, вы получаете:
$var
к истинеТак как вы используете ===
— который сравнивает тип и значение — для сравнения с логическим, это не совсем эквивалент.
Что, если $var = 5
?
!$var === true
становится !5 === true
, Это 0 === true
, который false
,!($var === true)
становится !(5 === true)
, Это !(false)
, который true
,Примечание: при выполнении !5
в первом примере 5
является преобразован в логическое значение, затем отрицается (вот как !
работает). Нет логического преобразования 5
во втором примере, так как вы используете ===
,
Примечание 2: 2-й пример эквивалентен $var !== true
,
Если $var
является логическим или логически эквивалентным значением, тогда первый фрагмент кода инвертирует его и затем сравнивает. Например, если $var = false
первый фрагмент оценивается как if (true === true) { ... }
, Изменяется само сравниваемое значение (не значение переменной, а значение, используемое для сравнения).
Это противоположно второму фрагменту кода, который инвертирует результат сравнения. В предыдущем примере true === true
результаты, очевидно, в true
, Во втором фрагменте, если $var = false
(как это было в предыдущем примере), затем false === true
ложно Однако затем мы отрицаем результат этого сравнения и получаем false
,
Ответы здесь одинаковы, но по сути они рассчитываются по-разному. Мне трудно думать о примере, в котором два результата приводят к разным ответам. Но то, что они делают, это две разные операции.
Как уже было сказано, первый пример: !$val
изменяет значение, которое используется для сравнения с true
тогда как второй пример, !($val === true)
изменяет результат сравнения двух разных значений.