PHP: Использование is_null() с! $Var или isset ($ var)

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

Устаревший код

if (is_null($result) || !$result) {

Реорганизованный код

if (!$result) {

Примечание: Я знаю, что это вызовет уведомление, если $result не установлено.

Вопрос

Является ли этот код логически эквивалентным?

Тесты кода

Я тестировал все комбинации ложные значения PHP без получения Не равным для....

$false_values = array(false, 0, 0.0, '0', '', null, array(), new stdClass());

foreach ($false_values as $var) {
    if (!$var != (is_null($var) || !$var)) {
        echo 'Not equal for: ';
        var_dump($var);
    }
}

Выход

$ php check.php
$

Ответ 1

Да, оба фрагмента эквивалентны. is_null определяется как:

Возвращает TRUE, если var имеет значение null, FALSE в противном случае.

В документации также ясно, что is_null выдает предупреждение, когда переменная undefined, также как и простая булева оценка $result. Если $result не задано, is_null($result) истинно, и поэтому вы получите одно предупреждение - такое же поведение, как и с !$result.

Поскольку булевская оценка NULL (неудивительно) ложна, мы можем просто проверить все интересные значения:

$result  is_null($result)  !$result   is_null($result) || !$result
(unset)   true(+warn)     true(+warn)          true (+warn)
null         true            true              true
false(-y)    false           true              true
true(-ish)   false           false             false

Обратите внимание, что результаты is_null и !$result идентичны для всех значений, которые также оцениваются как false, для всех, которые оценивают значение true. Поэтому дальнейшее различие (например, тестирование 0, "" и т.д.) Не требуется.

Ответ 2

A null переменная будет вычисляться до false в булевом контексте. Таким образом, операторы логически эквивалентны - когда переменная равна нулю, она будет улавливаться оператором !$result.

Используйте empty(), чтобы предотвратить предупреждение на уровне уведомлений:

if (!empty($result)) {
   // do something
}

Ответ 3

Из-за http://php.net/is_null вызов is_null($var) должен быть таким же, как $var === NULL.

Как тестирование !$var проверяет значение, поэтому любое пустое, пустое, несуществующее/не заданное или нулевое значение преобразуется в boolean false, а любое другое - в логическое true.

Поэтому вызов (is_null($result) || !$result), а $result будет любым из вашего $false_values, приведет к:

false          : (is_null(false) || !false)      => (false || true) => true
0              : (is_null(0) || !0)              => (false || true) => true
0.0            : (is_null(0.0) || !0.0)          => (false || true) => true
'0'            : (is_null('0') || !'0')          => (false || true) => true
null           : (is_null(null) || !null)        => (true || true)  => true
array()        : (is_null(array()) || !array())  => (false || true) => true
new stdClass() : (is_null(new cls) || ! new cls) => (false || true) => true

В качестве теста для !$var в вашем тесте всегда должно быть true , это очень O.K. Вы не получили Not equal for.

Если вы хотите избежать уведомлений, вы можете использовать этот тест:

if(isset($var) && $var) echo 'true story';

или

if(!isset($var) || !$var) echo 'this happens if false or not set at all';

Ответ 4

код является логическим эквивалентом как:

is_null(null) === true
and
!null === true

Да и, как сказали leepowers, используйте empty()