Оператор OR вызывает два разных поведения

#php

#php

Вопрос:

Я не могу понять, почему два условия, содержащие одинаковые значения, не возвращают один и тот же результат дважды.

Посмотрите на содержимое переменной :

 $quantity = 1;
var_dump(!$cart = true);
var_dump(!$product = false);
var_dump($quantity <= 0);
--------
Output : bool(false) bool(true) bool(false) 
  

Основываясь на этих логических значениях, я ожидаю, что вернется следующее условие TRUE :

 $quantity = 1;
var_dump(!$cart = true || !$product = false || $quantity <= 0);
---------
Output : bool(false)
  

Почему ? Я ожидал, что это будет TRUE

И почему следующее точно такое же условие выводит то, что я ожидал : TRUE

 var_dump(false || true || false);
---------
Output : bool(true)
  

Редактировать

Я знаю, что = это для назначения. Но делать это :

 if(!$var = null){
  // $var is not empty
}
  

Это способ присвоить значение и проверить, является ли это значение null|false|empty|array empty... одновременно.

Комментарии:

1. = присваивается, используется == или === для проверки равенства.

2. Я это знаю… Но если значению присваивается значение null, результат этого выражения возвращает false .

3. У присваивания другой приоритет оператора, чем у сравнения, т. Е. Ниже, чем у || оператора.

4. Нет, в этом фрагменте $var по-прежнему пусто, вы можете проверить это с var_dump помощью . И вы бы ввели условие из-за приведения , null это значение false-y , и вы его отрицаете. Если null бы была переменная с непустым значением, она не вошла бы в условие, поскольку она оценивалась бы if (false) как .

Ответ №1:

Речь идет о приоритете оператора и ассоциативности.

 var_dump(!$cart = true || !$product = false || $quantity <= 0);
  

совпадает с

 var_dump(!$cart = (true || !$product = false || $quantity <= 0));
  

Результат (true || !$product = false || $quantity <= 0) true . !true есть false .

Комментарии:

1. Хорошо, теперь я вижу… Это моя очень глупая ошибка. Итак, я должен это сделать var_dump((!$cart = true) || (!$product = null) || ($quantity <= 0));