Может ли это выражение когда-либо быть ложным?

Я проверяю некоторый код, и мне интересно, может ли это выражение когда-либо быть false:

!isset($_POST['foo']) || $_POST['foo']

Контекст:

$bar = (!isset($_POST['foo']) || $_POST['foo']) ? 1 : 0;

0

Решение

Согласно приведенному ниже быстрому тесту, это действительно возможно

$trueVar = true; // Or 1
$falseVar = false; // Or 0
$nullVar = null;
$emptyVar = "";

$result1 = (!isset($trueVar) || $trueVar) ? 1 : 0;
$result2 = (!isset($falseVar) || $falseVar) ? 1 : 0;
$result3 = (!isset($nullVar) || $nullVar) ? 1 : 0;
$result4 = (!isset($emptyVar) || $emptyVar) ? 1 : 0;

Output:
result1 = 1
result2 = 0
result3 = 1
result4 = 0

Примечание: почему бы вам просто не сделать $bar = isset($_POST['foo']) и узнать, пусто это или нет?

Редактировать: Funk Forty Niner — это правильный набор ($ _ POST) всегда будет возвращать true, потому что он всегда установлен из-за того, что является глобальной переменной, empty() следует использовать вместо этого или другой подход

https://3v4l.org/EtWn0

2

Другие решения

Вы можете подумать о следующих случаях:

  • $ _POST [‘foo’] не существует

$ bar = (true || null)? 1: 0 => 1

  • $ _POST [‘foo’] существует, и значение равно 0, ложь или пустая строка

$ bar = (false || true)? 1: 0 => 1

  • $ _POST [‘foo’] существует, и значение равно 0, ложь, пустая строка

$ bar = (false || false)? 1: 0 => 0

  • $ _POST [‘foo’] существует и значение равно нулю

$ bar = (true || false)? 1: 0 => 1

Я думаю, что вы должны прочитать это В php 0 считается пустым?

0

Постановка задачи:

!isset($_POST['foo']) || $_POST['foo']

Псевдокод с водками:

NOT isset($_POST['foo']) OR $_POST['foo']

Не имеет более высокую привязку, чем оператор ИЛИ (http://php.net/manual/de/language.operators.logical.php).

Что вы действительно спрашиваете: Есть ли isset($_POST['foo']) всегда оценивать с тем же результатом, что и $_POST['foo']?

Определение функции isset:

isset — определяет, установлена ​​ли переменная и не равна ли NULL

http://php.net/manual/en/function.isset.php

Следовательно, isset оценивается как false, только если переменная не существует и не равна нулю.

Автоматическое приведение к логическому:

Простая переменная в PHP в логическом условии оценивается как false при следующих условиях:

  • само логическое ЛОЖЬ
  • целое число 0 (ноль)
  • Поплавок 0.0 (ноль)
  • пустая строка и строка «0»
  • массив с нулевыми элементами
  • специальный тип NULL (включая неустановленные переменные)
  • SimpleXML объекты, созданные из пустых тегов

Увидеть: http://php.net/manual/en/language.types.boolean.php . Как видите, во многих случаях это не одно и то же.

Что ваш код означает словами: Если переменная имеет значение 0,0.0, «», «0», [] или пустой объект XML, верните 1.

0