Зная различия array_key_exists()
а также isset()
в PHP я вижу много сторонников в Интернете, предлагающих заменить array_key_exists()
с isset()
, но я думаю это безопасный сделать это?
В одном проекте у меня есть значение $ var, предоставленное пользователями. Значение может быть любым, даже NULL или не установлено вообще. Я хочу использовать !empty($var)
проверить, если $var
содержит непустое значение, но я понимаю, что с помощью !empty($var)
один опасен, так как если $var
не предопределено, PHP выдаст ошибку.
Так что я isset($var) && !empty($var)
для проверки $var
содержит непустое значение.
Тем не менее, все усложняется, когда у меня есть значение, хранящееся в массиве Assoc. Сравните следующие, предполагая массив $arr
всегда существует но ключ foo
может или не может существовать в $arr
,
// code snipplet 1
$arr = array();
echo isset($arr['foo']);
// code snipplet 2
$arr = array();
echo array_key_exists('foo', $arr) && !is_null($arr['foo']);
Фрагмент кода 2 всегда будет работать, но это кажется неуклюжим и труднее читать. Что касается фрагмент кода 1, У меня был плохой опыт … Я писал что-то подобное раньше на машине для разработки. Он работал нормально, но когда я развернул код на рабочей машине, он выдавал ошибки просто потому, что в массиве не было ключа. После некоторой отладки я обнаружил, что конфиги PHP отличались между разработкой и производственными машинами, и их версии PHP немного отличались.
Итак, я думаю, это действительно так безопасный просто заменить array_key_exists()
с isset()
? Если нет, то что может быть лучшей альтернативы фрагмент кода 2?
В одном проекте у меня есть значение $ var, предоставленное пользователями.
Как это работает? Пользователи не должны быть в состоянии установить переменные. Они должны иметь возможность, например, отправлять значения формы, которые в конечном итоге $_POST
, Я повторяю, они не должны быть в состоянии напрямую создать переменные в вашей области.
Если «пользователи» здесь означают какую-то систему плагинов, где люди пишут и include
PHP-код … тогда вы можете подумать об определении более стабильного интерфейса, чем установка переменных.
Значение может быть любым, даже NULL…
Нет, если это значение отправлено через HTTP. HTTP не имеет понятия null
, Это либо пустая строка, либо ее не существует вообще.
с помощью
!empty($var)
один опасен, так как если$var
не предопределено, PHP выдаст ошибку
Это не правильно. empty
конкретно существует для проверки переменной против ложный без выдачи ошибки. empty($var)
такой же как !$var
без вызова ошибки, если переменная не существует.
Так что я
isset($var) && !empty($var)
для проверки$var
содержит непустое значение.
Увидеть Зачем проверять isset () и! Empty (). (Спойлер: это избыточно.)
echo isset($arr['foo']); echo array_key_exists('foo', $arr) && !is_null($arr['foo']);
Оба они делают одно и то же. isset
возвращается true
если значение существует, а его значение не null
, Вторая строка возвращает true
если ключ массива существует и его значение не null
, То же самое.
У меня был плохой опыт …
Вы должны быть более подробно об этом, так как не должно быть никаких предостережений isset
как вы это описываете.
Увидеть Полное руководство по PHP isset И пусто а также Разница между isset и array_key_exists.
Других решений пока нет …