Из isset()
docs:
isset() will return FALSE if testing a variable that has been set to NULL.
В принципе, isset()
не проверяет, установлена ли переменная вообще, но установлено ли что-либо, кроме NULL
.
Учитывая, что лучший способ проверить наличие переменной? Я попробовал что-то вроде:
if(isset($v) || @is_null($v))
(@
необходимо избегать предупреждения, если $v
не задано), но is_null()
имеет схожую проблему с isset()
: он возвращает TRUE
в unset variables! Также представляется, что:
@($v === NULL)
работает точно так же, как @is_null($v)
, так что тоже.
Как мы должны надежно проверять наличие переменной в PHP?
Изменить: есть явно разница в PHP между переменными, которые не установлены, и переменными, которые установлены на NULL
:
<?php
$a = array('b' => NULL);
var_dump($a);
PHP показывает, что $a['b']
существует и имеет значение NULL
. Если вы добавите:
var_dump(isset($a['b']));
var_dump(isset($a['c']));
вы можете видеть двусмысленность, о которой я говорю, с помощью функции isset()
. Здесь вывод всех трех этих var_dump()s
:
array(1) {
["b"]=>
NULL
}
bool(false)
bool(false)
Дальнейшее редактирование: две вещи.
Один, прецедент. Массив, который преобразуется в данные оператора SQL UPDATE
, где ключи массива являются столбцами таблицы, а значения массива - значения, которые должны применяться к каждому столбцу. Любой столбец таблицы может содержать значение NULL
, означаемое передачей значения NULL
в массиве. Вам нужно различать не существующий ключ массива, а значение массива - NULL
; что разница между не обновлением значения столбца и обновлением значения столбца до NULL
.
Во-вторых, ответ Zoredache, array_key_exists()
работает корректно, для моего примера использования и для любых глобальных переменных:
<?php
$a = NULL;
var_dump(array_key_exists('a', $GLOBALS));
var_dump(array_key_exists('b', $GLOBALS));
выходы:
bool(true)
bool(false)
Так как это правильно обрабатывает почти всюду, я вижу, что существует какая-то двусмысленность между переменными, которые не существуют, и переменными, которые установлены на NULL
, Я называю array_key_exists()
самым простым в PHP способом чтобы действительно проверить наличие переменной.
(Только другой случай, о котором я могу думать, относится к свойствам класса, для которых существует property_exists()
, который, согласно своим документам, работает аналогично array_key_exists()
тем, что он правильно различает, не устанавливая и устанавливая на NULL
.)