isset бесполезен?

180
18 апреля 2018, 06:51

Сколько пишу на php ни разу isset не пригодился. Я проверял даже - если в массиве нет ключа, но ты пытаешься его получить то возвращает null без ошибок (по мне так лучше бы исключение кидал как в других языках). В то же время isset вернет false и если ключ есть, но значение по этому ключу null, поэтому уж лучше тогда проверять array_key_exists. Так вот isset реально бесполезен?! Или есть какой-то толк?

P.S. Вопрос больше про применение isset с массивами. Ну наверное его можно применять для проверки существования переменной, хотя и то проще на null проверить с тем же успехом по моему. К тому же IDE обычно подсказывает если пытаешься использовать не инициализированную переменную.

Answer 1

Конечно есть, у вас скорее всего выключены Notice ошибки, и на самом деле у вас очень в многих местах.

  1. Как вы проверяете наличие $_GET, $_POST переменные на их наличие?
  2. Небольшой пример который показывает что выводит ошибку при echo $array[1];

Вообще проверять на наличие чего либо, стоит всегда. Вы конечно в чем то правы про null / false / array_key_exists. Но лучше всегда проверять. Ключом массива может переменная которой может быть. Или же может не быть входных параметров при запросе к базе данных, добавив isset вы только облегчите себе в дальнейшем читаемость и предсказуемость кода. Без банальных проверок, вы когда-нибудь при переезде на новый сервер можете быть сильно удивлены сколько все таки ошибок у вас.

Answer 2

Наиболее частый кейс использования isset - проверка входных данных. Так как PHP, фактически, является языком обрабатывающим пользовательские запросы - этот кейс как никогда актуален.

@lazyproger совершенно верно акцентировал внимание на проверках $_GET и $_POST, от которых никуда не деться в любом проекте чуть сложнее landing page.

Касательно массивов - isset часто бывает полезен при валидации массивов, полученных посредством json_decode из json-ответа стороннего API например. В общем случае он будет работать быстрее, чем array_key_exists (на копейки правда, но все же), но с нюансом относительно NULL - это да. С другой стороны, полученный в ответ NULL зачастую, для логики приложения, равносилен отсутствию значения.

UPD немного кишок про isset и array_key_exists

$a=[];
isset($a['a']);

компилируется в

line     #* E I O op                           fetch          ext  return    operands
-------------------------------------------------------------------------------------
   2     0  E >   EXT_STMT
         1        ASSIGN                                                   !0, <array>
   4     2        EXT_STMT
         3        ISSET_ISEMPTY_DIM_OBJ                       33554432  ~2      !0, 'a'
         4        FREE                                                     ~2
   6     5      > RETURN                                                   1

А это

$a=[];
array_key_exists('a', $a);

в

line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   EXT_STMT
         1        ASSIGN                                                   !0, <array>
   4     2        EXT_STMT
         3        INIT_FCALL                                               'array_key_exists'
         4        EXT_FCALL_BEGIN
         5        SEND_VAL                                                 'a'
         6        SEND_VAR                                                 !0
         7        DO_FCALL                                      0
         8        EXT_FCALL_END
   6     9      > RETURN                                                   1

Как мы видим, в первом случае на все про все один опкод ISSET_ISEMPTY_DIM_OBJ, во втором случае вызов подпрограммы с передачей туда сюда переменных и значений

Answer 3

Вопрос больше про применение isset с массивами

Используйте для работы с массивами соответствующие функции.

isset() вам поможет определить, была ли установлена переменная значением, отличным от NULL. Эта конструкция так же бывает удобна для проверки нескольких переменных в одном выражении, например:

$a = 1;
$b = 1;
$c = null;
$d = 1;
$e = 1;
var_dump( isset($a, $b, $c, $d, $e) ); // boolean false
READ ALSO
Экспорт массива в CSV документ в Symfony

Экспорт массива в CSV документ в Symfony

Eсть такой массив (через print_r вывел):

205
Загрузка обложки VK. Ошибка 129

Загрузка обложки VK. Ошибка 129

При отправке изображения приходит и hash и photoНо при сохранении пишет ошибка 129 файл не найден

235
Как сделать проверку наличия директивы Host в robots.txt

Как сделать проверку наличия директивы Host в robots.txt

Привет!Я начал изучать то как работают поисковые роботы яндекса и мне по заданию нужно сделать проверку на наличие директивы Host в файле robotstxt

191
Обработка sum()

Обработка sum()

Данные в столбце summa хранятся с пробелами после тысячных (76 466)

175