Страницы

Поиск по вопросам

вторник, 25 декабря 2018 г.

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

Писал код писал...потом подумал я же все время перед тем как использовать переменную всегда делаю присвоение значением того типа который мне нужен. Почитал мануал для уверенности, проведя несколько тестов возникли вопросы:
Если мы используем неинициализированную переменную мы словим Notice, хотя в мануале написано что использовать неинициализированные переменные это очень хорошая практика, где?(Возможно это криво написано в мануале, возможно имелось ввиду наоборот) Если мы попытаемся к неициализированной переменной сделать допустим конкатенацию, мы словим Notice, хотя если мы напишем переменной изначально NULL, то Notice мы не словим, хотя опять же если мы выведем неинициализированную переменную через var_dump мы получим NULL...выходит в одном случае есть Notice, а в другом нет, почему? Если мы присвоим переменной значение NULL будет ли считаться что переменная инициализированна? А если мы просто напишем переменную и в конце поставим точку с запятой будет ли это являться тем что переменная неинициализированна?(В мануале ни разу не видел чтобы просто писали переменную без присвоения)
P.S Если я вспомню еще какие-то вопросы по этой теме отпишу...я не знаю возможно мои вопросы связаны с тем что я не понимаю тип NULL?


Ответ

Для начала - тип 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
Теперь ответы на вопросы
Если мы используем неинициализированную переменную мы словим Notice, хотя в мануале написано что использовать неинициализированные переменные это очень хорошая практика, где?(Возможно это криво написано в мануале, возможно имелось ввиду наоборот)
В мануале написано, что хотя инициализировать и не обязательно, но считается хорошей практикой!
Если мы попытаемся к неициализированной переменной сделать допустим конкатенацию, мы словим Notice, хотя если мы напишем переменной изначально NULL, то Notice мы не словим, хотя опять же если мы выведем неинициализированную переменную через var_dump мы получим NULL...выходит в одном случае есть Notice, а в другом нет, почему?
Про разницу null и неициализированной написал выше.
Если мы присвоим переменной значение NULL будет ли считаться что переменная инициализированна? А если мы просто напишем переменную и в конце поставим точку с запятой будет ли это являться тем что переменная неинициализированна?(В мануале ни разу не видел чтобы просто писали переменную без присвоения)
Если присвоить NULL - да, она будет инициализированной. Если просто напишем и в конце точка с запятой - нет, она так и будет неинициализированной.

Комментариев нет:

Отправить комментарий