Инициализация переменной в PHP

320
10 декабря 2016, 10:05

Писал код писал...потом подумал я же все время перед тем как использовать переменную всегда делаю присвоение значением того типа который мне нужен. Почитал мануал для уверенности, проведя несколько тестов возникли вопросы:

  1. Если мы используем неинициализированную переменную мы словим Notice, хотя в мануале написано что использовать неинициализированные переменные это очень хорошая практика, где?(Возможно это криво написано в мануале, возможно имелось ввиду наоборот)

  2. Если мы попытаемся к неициализированной переменной сделать допустим конкатенацию, мы словим Notice, хотя если мы напишем переменной изначально NULL, то Notice мы не словим, хотя опять же если мы выведем неинициализированную переменную через var_dump мы получим NULL...выходит в одном случае есть Notice, а в другом нет, почему?

  3. Если мы присвоим переменной значение NULL будет ли считаться что переменная инициализированна? А если мы просто напишем переменную и в конце поставим точку с запятой будет ли это являться тем что переменная неинициализированна?(В мануале ни разу не видел чтобы просто писали переменную без присвоения)

    P.S Если я вспомню еще какие-то вопросы по этой теме отпишу...я не знаю возможно мои вопросы связаны с тем что я не понимаю тип NULL?

Answer 1

Для начала - тип null

NULL - это единственно возможное значение типа null.

Переменная считается null, если:

  • ей была присвоена константа NULL.
  • ей еще не было присвоено никакого значения.
  • она была удалена с помощью unset().

Почему вообще это работает

Интерпретатор PHP использует позднее связывание(динамическая типизация - переменные связываются с типом в момент присвоения значения), потому возможно выполнение кода с переменными, которые никогда не были объявлены.

Но тем не менее между явно объявленной null-переменной и не объявленной разница есть!

Неинициализированная, NULL, пустая и заданная переменная

$null = NULL; // заданная null
$empty = ""; // заданная и пустая
$true = true; // заданная и не пустая
unset($undefined); // не инициализированная/не заданная (unset() тоже, что ее и не было)

Вот как это выглядит в интерпетаторе php:

Т.е. мы видим, что если переменная не задана, то она ВООБЩЕ ПУСТАЯ!

Результат функций isset, empty, is_null:

Тогда в чем разница и где ее увидеть???

При попытке обращения к неинициализированной переменной PHP отдаст значение NULL и сгенерирует E_NOTICE ошибку!

Чтобы проверить существовала ли переменная или ей было задано значение NULL - нужно воспользоваться функцией array_key_exists:

  • array_key_exists('name_of_variable', $GLOBALS); для проверки в глобальной области видимости
  • array_key_exists('name_of_variable', get_defined_vars()); для проверки в текущей области видимости

В текущем примере она сработает так:

array_key_exists('null', get_defined_vars()); // будет true
array_key_exists('undefined', get_defined_vars()); // будет false

Теперь ответы на вопросы

  1. Если мы используем неинициализированную переменную мы словим Notice, хотя в мануале написано что использовать неинициализированные переменные это очень хорошая практика, где?(Возможно это криво написано в мануале, возможно имелось ввиду наоборот)

В мануале написано, что хотя инициализировать и не обязательно, но считается хорошей практикой!

  1. Если мы попытаемся к неициализированной переменной сделать допустим конкатенацию, мы словим Notice, хотя если мы напишем переменной изначально NULL, то Notice мы не словим, хотя опять же если мы выведем неинициализированную переменную через var_dump мы получим NULL...выходит в одном случае есть Notice, а в другом нет, почему?

Про разницу null и неициализированной написал выше.

  1. Если мы присвоим переменной значение NULL будет ли считаться что переменная инициализированна? А если мы просто напишем переменную и в конце поставим точку с запятой будет ли это являться тем что переменная неинициализированна?(В мануале ни разу не видел чтобы просто писали переменную без присвоения)

Если присвоить NULL - да, она будет инициализированной.
Если просто напишем и в конце точка с запятой - нет, она так и будет неинициализированной.

READ ALSO
Get сurrent URL

Get сurrent URL

Есть ajax форма на которую переходят по ссылке с видео (жалоба), ссылка вида: http://sitecom/abuse/index

320
Почему Symfony3 forwarding уходит в цикл?

Почему Symfony3 forwarding уходит в цикл?

Открываю site/app_devphp/s/text, выводит капчу

231
preg_replace проблемы

preg_replace проблемы

Как изменить ответ http://drupalstackexchange

278
Непонятное поведение страницы

Непонятное поведение страницы

Добрый деньЕсть страница, при переходе на которую проблем не возникает

272