PHP « Использование суперглобальных переменных в функциях
1 ответов
Суперглобальные переменные видны из любой функции, для видимости глобальных необходимо их обозначить словом global в функции
var $glob_var = "global variable";
function test() {
global $glob_var;
echo $glob_var;
}
В руководстве по PHP всё понятно написано об этом.
Итак. В PHP С областями видимости переменных и идентификаторов все не так, как в других языках программирования. Корни этого с позволения сказать маразма растут еще из тех времен, когда PHP предполагался использоваться по назначению. То бишь как Personal Home Page Tools. Маленькие скрипты, встраивающиеся прямо в тело страниц. Соответственно и переменные там были не просто переменные а штука связаная напрямую с параметрами вызова страниц. ( registerglobals, quote и . т. п.) Это было удобно. Так как интерпретатор сам умел создавать переменные из параметров запроса. Сам экранировать и синимать экраны с символов значений. Собственно говоря это и была так штука, благодаря которой PHP начал стремительно выдавливать от же Perl. Никаких областей видимости не было вообще. Потому как предполагалось, что на php будут писаться функции "в три строки и не более". Но вот наступил момент, когда ниша PHP выросла настолько, что его признали настоящим языком программирования. И тут все прелести и достоитнтва языка стали внезапно его недостатками. И возможность написания кода лапшой, и отсутствие видимости идентификаторов, и автоматическое создание переменных из параметров запроса и автоматическое квотирование и отсутствие внятной стратегии сборки исполняемого модуля из файлов и отстутсвие классов и ссылок и ... в общем практически все. И PHP стал стремительно обрастать костылями. От версии к версии. Всю историю костылей вы можете без труда проследить в интернете. Я же остановлюсь на переменных. Так как именно это и послужило темой вопроса.
Итак что мы имеем на сегодняшний день. ( если не лазить в дебри безнадежно устаревших registerglobals и проч ).
0. В PHP не реализован механимм иерархий областей видимости. То есть работает классические правило иерархии областей видимости.
1. Есть суперглобальные переменные и идентификаторы. Видимые любого места программы. К ним относятся
- константы
- объявления классов
- Некоторые встроенные переменные $_SERVER argv argc $_COOKIE $_FILES $_POST $_SESSION $GLOBALS и еще целая куча.
2. Переменные с автоматической областью видимости ( когда видны, а когда и нет. Зависит от внутреннего состояния скрипта $php_errormsg и иже с ними.
3. Если перед использованием переменной внутри фуцнкции задекларировать ее при помощи директивы global, то она появится в массиве $GLOBALS и в дальнейшем ее можно использовать в других местах программы либо повторно объявив при помощи директивы global, либо обращаясь напрямую к массиву $GLOBALS, где имя переменной будет ключом массива.
4. Статические переменные - единожды создаваемые и видимые постоянно внутри внутри объявленной функции
5. Все остальные идентификаторы являются локальными и видны лишь в той области, где объявлены.
Еще раз посторюсь. Иерархии областей видимости нет. Переменная объявленная внутри функции не будет видна в дочерней функции. Отсюда мораль собствено и растут ноги невероятно большоко кодичества глобаьных переменных при использовании процедурного метода написания программ на PHP. Большое количество глобальных переменных всегда неудобно. Конфликты имен и т. п. И начиная с 4 версии PHP программисты приспособили уже чисто алгоритмический ксотыль - синглтон. В PHP синглтон используется чаще всего не так, как в других языках. Обычно он лишь хранилище переменных и фцнкций. Некая сущность, преждназначенная для разделения областей видимости идентификаторов. Пусть и не вертикально. Пусть горизонтально. Но это уже что-то. Синглтон начал править миром PHP. В последних версиях PHP появился namespace. По-сути перенос костыльной стратегии использования синглтонов как разделителей областей видимости в возможности языка. В общем во как-то так.