Установлена переменная или нет и является ли она нулевой?
Попытка определить, является ли переменная одним из следующих возможных результатов:
- Имеет ненулевое значение
- Имеет значение NULL
- Не установлен вообще
Я начал с этого:
if ( isset($value) )
var_dump("It's set");
else
var_dump("Not set");
Это охватывает, была ли переменная установлена или нет. Однако я также хочу охватить, если переменная равна нулю или нет. Зная следующее:
$value = null;
var_dump( isset($value) ); // Returns false
Таким образом, нулевое значение возвращается как не установленное. Так что я не могу сделать это:
if ( isset($value) )
var_dump("It's set");
else if ( is_null($value) ) // This throws exception if $value is not set
var_dump("It's null");
else
var_dump("Not set");
Также не могу сделать это:
if ( isset($value) ) {
var_dump("It's set");
} else {
if ( is_null($value) )
var_dump("It's null"); // Also throws an exception because $value is not set
else
var_dump("Not set");
}
Сначала я думал, что будет простой способ сделать это, но это ускользает от меня. Проблема сводится к тому, что null
значение определяется как не заданное, но вы не можете проверить с помощью is_null()
для не заданного значения.
Как мне решить эту проблему? Я что-то упускаю из виду? Нужно ли прибегать к try catch
?
И если вам интересно, я задаю этот вопрос, потому что есть ситуация, когда разработчик может передать переменную чему-либо, и мне нужно иметь возможность различать, передал ли разработчик переменную со значением или значением NULL или не прошел это вообще.
4 ответа
Лучший ответ, который я могу дать, заключается в том, что вы не должны пытаться полагаться на то, установлено ли что-то или нет, а вместо этого структурировать свой код так, чтобы он всегда был установлен.
Только что увидел ваше редактирование.
Параметр функции может иметь значение по умолчанию, так что вы знаете, что оно всегда установлено. function myFun($variable = null)
гарантирует, что доступ к переменной $ никогда не вызовет исключения.
Изменить: Если вам действительно нужно знать, был ли передан параметр или нет, используйте func_get_args(). Он возвращает массив, и вы можете проверить его размер.
function foo($bar) {
var_dump(func_get_args());
}
foo();
foo('foo');
дает вывод:
array(0) {
}
array(1) {
[0] =>
string(3) "foo"
}
Кстати, вызов foo() без аргументов выдает ошибку:
PHP Warning: Missing argument 1 for foo(), called in /Users/pittsd/dev/cbsi/fly/cnet/expirement/expirement.php on line 6 and defined in /Users/pittsd/dev/cbsi/fly/cnet/expirement/expirement.php on line 2
Warning: Missing argument 1 for foo(), called in /Users/pittsd/dev/cbsi/fly/cnet/expirement/expirement.php on line 6 and defined in /Users/pittsd/dev/cbsi/fly/cnet/expirement/expirement.php on line 2
Для дальнейшего ответа на ваш вопрос:
<?php
function foo() {
if (func_get_args()) {
$value = func_get_args()[0];
if ($value === null) {
echo "Have a null value. ". PHP_EOL;
} else {
echo "Have a value: ".$value. PHP_EOL;
}
}
else {
echo "No value passed in.". PHP_EOL;
}
}
foo(null);
foo('foo');
foo();
выходы:
Have a null value.
Have a value: foo
No value passed in.
В общем случае вы можете выполнить проверку без каких-либо исключений следующим образом:
if(isset($value)) {
if($value===null) {
// exists and null
}
else {
// exists and not null
}
}
else {
// doesn't exists
}
РЕДАКТИРОВАТЬ:
Как вы упомянули в комментариях, приведенный выше код не будет работать как исключение, но у меня есть другое решение, чтобы проверить, существует ли переменная и имеет ли значение null:
var_dump(array_key_exists('value', get_defined_vars())); // false
$value = null;
var_dump(array_key_exists('value', get_defined_vars())); // true
if (!empty($value) ) // if is not empty
or
if (empty($value)) // if is empty
Неопределенная ошибка переменной - это ошибка Уведомления, которая не остановит выполнение вашего скрипта.
Также он не остановится, если вы окружите try-catch{} вашими предложениями if, так что вы можете просто подавить эту ошибку. Обычно в производственной среде ошибки уведомления скрыты.
Ваш код будет отлично работать, если он:
if($value == null) { // or @$value == null for suppressing this error ?
if (count(error_get_last()) == 0) {
echo 'null';
} else {
echo 'value is not set';
}
} else {
echo 'value is: '. $value;
}
Вы можете проверить, есть ли сообщение об ошибке после проверки на ноль, если оно есть, это означает, что оно не установлено.
Давайте проверим это.
Сначала мы ничего не пропускаем. Это печатает:
value is not set
Теперь мы проходим $value = null;
, Это печатает:
null
Теперь мы проходим $value = 'something';
, Это печатает:
value is: something