Может ли это выражение когда-либо быть ложным? - PullRequest
0 голосов
/ 09 января 2019

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

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

Контекст:

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

Ответы [ 3 ]

0 голосов
/ 09 января 2019

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

  • $ _ 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 голосов
/ 09 января 2019

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

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

Псевдокод с wods:

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 голосов
/ 09 января 2019

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

$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

...