PHP програмиране и register_globals, PHP
Какво е register_globals? Това е една от php опциите, дефинирани във файла php.ini. Подробно описание може да бъде намерено в съответния раздел на документацията http://php.net/manual/en/configuration.php#ini.register-globals. Може да приема две стойности: включено и изключено.
Едно от неоспоримите предимства на PHP е неговата простота. PHP ви позволява да вмъквате малки фрагменти от код в HTML маркирането, което улеснява дизайнерите на оформление да научат този език. Сходството на синтаксиса на PHP с C++, слабото писане, изобилието от документация и примери правят първите стъпки в програмирането доста лесни. Но една скорошна промяна наистина озадачи начинаещите: от php 4.2.0 флагът register_globals е настроен на "Изключено". Това отрича една от причините за лесното учене на езика.
Начини за получаване на данни в php скрипт
Опитни програмисти, които са се занимавали с GET/POST заявка на данни или променливи на средата може да намерят този раздел излишен.
Променливите в PHP възникват по много причини. Например, можете сами да създадете променлива, като напишете $var = 'стойност'. Този фрагмент от статията е посветен на отговорите на въпросите: „Откъде идват променливите в PHP?“, „Как данните от формата влизат в сървъра?“. Голяма част от фокуса е върху обяснението как това се е случило, когато register_globals=On.
Адресна лента
От PHP 4.1.0 хеш масивът $_GET съдържа същите стойности като $HTTP_GET_VARS. За разлика от своя предшественик, това е суперглобален масив и ползите от него ще бъдат описани по-долу.
Формуляри (метод POST)
Формулярите са друг доста често срещан начин за предаване на въведена от потребителя информация. Помислете за пример:
Когато потребителят щракне върху бутона „Изпращане“, браузърътизпраща POST заявка до script.php. Стойностите на входния елемент ще бъдат предадени в тялото на заявката. С флаг register_globals, зададен на On, скриптът script.php автоматично инициализира глобалната променлива $foo = 'bar'.
Подобно на GET заявка, глобалният хеш масив $HTTP_POST_VARS съдържа всички променливи, предадени от браузъра, и в нашия пример ще изглежда така: $HTTP_POST_VARS['foo'] = 'bar'.
От PHP 4.1 нататък суперглобалният хеш масив $_POST съдържа подобни данни.
В основата си една уеб страница (което означава нейната html-същност, достъпна за човек, разглеждащ сайта) се ражда, когато се осъществи достъп до сървъра въз основа на данните, предадени в клиентската заявка, и умира, когато потребителят затвори браузъра. Разработчиците са имали естествено желание от дълго време да научат как да запазват някакво състояние, когато потребителят се движи от страница на страница, за да реализират по-пълно диалоговия прозорец за взаимодействие. Така се появи технологията Cookie, която ви позволява да запазите информация на диска на клиента и да я извлечете за по-нататъшна обработка.
Примерен код, който задава бисквитка, изглежда така:
Забележка: ако register_globals = 'off' вместо $HTTP_HOST трябва да използвате $_SERVER['HTTP_HOST'].
Всички бисквитки, зададени в този домейн, са достъпни за работа с тях в глобалния асоциативен хеш масив $HTTP_COOKIE_VARS и суперглобалния хеш масив $_COOKIE.
Променливи на сървърната среда
Средата на операционната система, точно както средата на уеб сървъра, съдържа много променливи, които могат да се използват при писане на скриптове. Например, те се използват за определяне на името на скрипта, който се изпълнява, или името на заявениядомакин.
За достъп до тези променливи PHP създава глобалните хеш масиви $HTTP_ENV_VARS и $HTTP_SERVER_VARS. От PHP версия 4.1 и по-нови са налични суперглобалните хеш масиви $_ENV и $_SERVER.
Използване на суперглобални масиви.
Обикновено всяка от променливите, използвани във функция, е в нейното локално пространство от имена. Това означава, че ако, например, искаме да имаме достъп до глобалната променлива $HTTP_GET_VARS, тогава трябва да напишем global $HTTP_GET_VARS; преди всеки достъп до този масив.
Забележка: не можете да използвате препратки към променливи към суперглобални масиви. Например следният код няма да работи:
Функцията foo(), описана по-горе, няма да върне предвидените данни от суперглобалния масив $_GET.
Функции за кодиране
Бях изненадан да открия в себе си желание да се върна към обичайния си стил на кодиране, използвайки глобални променливи. Но, като се вземат предвид проблемите със сигурността и редица други причини, беше решено да се напише функция, която да улесни прехода към новия стандарт.
Тази функция ви позволява да "регистрирате" променлива, която искате да използвате в скрипт. За да направите това, просто напишете: $mode = register('mode');. Тази функция е написана да следва стойността по подразбиране на опцията variables_order в конфигурационния файл php.ini. (Подробна документация е достъпна на http://php.net/manual/en/configuration.php#ini.variables-order). Резултатът, върнат от него, е напълно идентичен със стойността, която тази променлива би имала с опцията register_globals=On. Тази функция също ви позволява да посочите стойност по подразбиране, с която искате да инициализирате променлива, ако не е декларирана в нито един от масивите.
Вярно ли е,тази функция има един малък недостатък: тя винаги инициализира исканата променлива с някаква стойност. Тъй като някои от моите кодови фрагменти използваха проверки с функцията isset, функцията трябваше да бъде леко модифицирана:
Тази функция приема като параметър масив от имена на променливи, които бихте искали да направите "глобални". Ако исканата променлива присъства в масивите $_GET или $_POST, тя ще бъде съответно инициализирана. В противен случай той ще остане недеклариран и все още можете да използвате проверки с функцията isset().
Тази функция е особено полезна, когато пишете манипулатор на формуляр, можете лесно да инициализирате всички необходими променливи:
Забележка за мързеливите
Заключение
Като прочетете материала в тази статия, трябва да имате представа откъде идват променливите в PHP и как да преминете към стандарта register_globals = Off.
Успех, щастливи и безопасни програми за писане.