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()