Страницы

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

вторник, 31 декабря 2019 г.

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

#php


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


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

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

    


Ответы

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

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

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