Замена array_key_exists () на isset () в PHP - PullRequest
0 голосов
/ 25 мая 2018

Зная различия array_key_exists() и isset() в PHP, я вижу много сторонников в Интернете, предлагающих заменить array_key_exists() на isset(), но я думаю, что безопасно для этого?

В одном проекте у меня есть значение $ var, предоставленное пользователями.Значение может быть любым, даже NULL или не задано вообще.Я хочу использовать !empty($var), чтобы проверить, содержит ли $var непустое значение, но я понимаю, что использование только !empty($var) опасно, поскольку, если $var не задано заранее, PHP выдаст ошибку.

Итак, у меня есть isset($var) && !empty($var) для проверки, содержит ли $var непустое значение.

Однако все становится сложнее, когда у меня есть значение, хранящееся в массиве ассоциаций.Сравните следующее, предполагая, что массив $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 ?

1 Ответ

0 голосов
/ 25 мая 2018

В одном проекте у меня есть значение $ var, отправленное пользователями.

Как это работает?Пользователи не должны иметь возможность устанавливать переменные .Они должны иметь возможность, например, отправлять значения формы, которые заканчиваются на $_POST.Я повторяю, они не должны иметь возможность напрямую создавать переменные в вашей области действия .

Если "пользователи" здесь означают какую-то систему плагинов, где люди пишут и include код PHP ... тогдаВы можете подумать об определении более стабильного интерфейса, чем установка переменных.

Значение может быть любым, даже NULL…

Нет, если это значение передается через HTTP,HTTP не имеет понятия null.Это либо пустая строка, либо ее вообще нет.

использование только !empty($var) опасно, поскольку, если $var не задано заранее, PHP выдаст ошибку

Это неправильно.empty , в частности, существует для проверки переменной против false без выдачи ошибки.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, посколькуВы описываете это.

См. Полное руководство по isset PHP И пусто и Разница между isset и array_key_exists .

...