Из isset()документов :
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неустановленные переменные! Также кажется, что:
@($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.)
register_globals, я все еще изо всех сил пытаюсь придумать ситуацию, когда даже это потребовало бы такого различия, поскольку все, что зарегистрировано из запроса HTTP, всегда будет строкой, а не null.