Замена array_key_exists () на isset () в переполнении стека

Зная различия 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?

0

Решение

В одном проекте у меня есть значение $ 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.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]