Из 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
.Ответы:
Если проверяемая переменная будет в глобальной области видимости, вы можете сделать следующее:
источник
$defined_vars = get_defined_vars();
а затем выполнить тестирование с помощьюarray_key_exists('v', $defined_vars);
.isset($foo[$bar])
становитсяarray_key_exists($bar, $foo)
property_exists
кажется многообещающим, за исключением этого:> Функция property_exists () не может обнаружить свойства, которые магически доступны, используя магический метод __get.