В PHP версии 4 и выше введено понятие "суперглобальных" массивов. Эти массивы содержат всю информацию о состоянии сервера и среды выполнения скрипта. Массивы доступны в любом месте скрипта без дополнительных объявлений, т.е. не надо использовать ключевое слово global.
Всего массивов девять. Имена всех массивов записываются заглавными буквами, а начинается имя всегда с "$_" (кроме массива $GLOBALS).
$GLOBALS | Массив содержит ссылки на все переменные, объявленные в данном скрипте. Это ассоциативный массив, в котором имена переменных являются ключами. |
$_SERVER | Массив содержит все данные о настройках среды выполнения скрипта и параметры сервера. |
$_GET | Список переменных, переданных скрипту методом GET, т.е. через параметры URL-запроса. |
$_POST | Список переменных, переданных скрипту методом POST. |
$_COOKIE | Массив содержит все cookies, которые сервер установил на стороне пользователя. |
$_FILES | Содержит список файлов, загруженных на сервер из формы. |
$_ENV | Содержит переменные окружения, установленные для всех скриптов на сервере. |
$_REQUEST | Этот массив объединяет массивы $GET, $POST и $COOKIE. очень часто бывает удобен при обработке пользовательских запросов, но применять его для защищённой обработки данных не стоит. |
$_SESSION | Массив содержит все переменные сессии текущего пользователя. |
Просмотреть содержимое всех масивов можно в результате вызова функции phpinfo().
Рассмотрим примеры использования глобальных массивов.
С помощью этого массива можно узнать практически всё о сервере, на котором исполняется скрипт. Например:
<?php echo 'параметры сервера:' . "<br />\n"; echo "Операционная система: " . $_SERVER["OS"] . "<br />\n"; echo "Web-сервер: " . $_SERVER["SERVER_SOFTWARE"] . "<br />\n"; echo "Имя сервера: " . $_SERVER["SERVER_NAME"] . "<br />\n"; echo "Адрес сервера: " . $_SERVER["SERVER_ADDR"] . "<br />\n"; echo "Порт сервера: " . $_SERVER["SERVER_PORT"] . "<br />\n"; echo "Адрес клиента: " . $_SERVER["REMOTE_ADDR"] . "<br />\n"; echo "Путь к документам на сервере: " . $_SERVER["DOCUMENT_ROOT"] . "<br />\n"; echo "Полный путь к текущему скрипту: " . $_SERVER["SCRIPT_FILENAME"] . "<br />\n"; echo "Имя текущего скрипта: " . $_SERVER["PHP_SELF"] . "<br />\n"; ?>
Пользоваться этим массивом нужно аккуратно, т.к. некоторые сервера имеют достаточно специфичные настройки или значения параметров. Иногда это приводит к неприятным ошибкам, которые к тому же очень сложно диагностировать и исправить. Например, параметры $_SERVER["REQUEST_URI"] и $_SERVER["SCRIPT_NAME"] могут быть не установлены (хотя один из них как правило присутствует).
В эти массивы помещаются данные, передаваемые скрипту извне (так называемый, пользовательский ввод). В принципе, пользователь может влиять только на эти два массива плюс массив файлов и cookie. И именно поэтому все элементы этих массивов должны тщательно проверяться на допустимые значения.
Например, если пользователь ввёл в строку адреса браузера адрес "http://localhost/index.php?name=Dmitry&fam=Medvedev&jt=president&country=Russia", то массив $_GET надо будет обрабатывать так:
<?php /* Предполагаем, что массив $_GET должен содержать следующие элемены $_GET['name'] = "Dmitry"; $_GET['fam'] = "Medvedev"; $_GET['jt'] = "president"; $_GET['country'] = "Russia"; */ // Теперь проверим наличие данных, // а для недостающих – возьмём пустую строку $name = (isset($_GET['name']))? $_GET['name']:' не указано '; $fam = (isset($_GET['fam']))? $_GET['fam']:' не указано '; $jt = (isset($_GET['jt']))? $_GET['jt']:' не указано '; $country = (isset($_GET['country']))? $_GET['country']:' не указано '; echo "Страна: $country <br />\n"; echo "Фамилия: $fam <br />\n"; echo "Имя: $name <br />\n"; echo "Должность: $jt <br />\n"; ?>
Этот скрипт будет устойчиво работать при любом GET-запросе, даже если не будет указан ни один параметр. Если используется метод POST, то достаточно заменить $_GET на $_POST. А если вам совершенно не важно, откуда получены данные – воспользуйтесь массивом $_REQUEST (см. ниже).
При работе с пользовательским вводом есть одно правило:
Никогда не доверяйте данным, получаемым извне.
Всё, что пользователь может изменить, неправильно написать или не ввести – он однажды изменит, напишет или не введет. Намеренно или случайно – это уже другой вопрос. Но в любом случае, все вводимые данные должны проверяться и перепроверяться. Однажды написанная процедура проверки данных избавит вас от множества проблем и лишней работы по установке и отладке.
В массив $_COOKIE автоматически помещаются все cookies, которые получены от браузера. Механизм cookies мы подробно рассмотрим в соответствующем уроке. А пока вам достаточно запомнить, что есть глобальный массив, из которого в любое время можно узнать какие cookies установлены на стороне клиента.
Массив $_REQUEST объединяет три массива: $_POST, $_GET, $_COOKIES. В ранних версиях PHP сюда же входил массив $_FILES, но из соображений безопасности и производительности его исключили. Пользоваться массивом $_REQUEST очень удобно в случаях, когда нет разницы, каким методом был сделан запрос. Например, при постраничном выводе данных номер страницы можно передавать через URL ("index.php?page=3") методом GET, а можно через элемент формы методом POST. И в том и в другом случае переменная page попадёт в массив $_REQUEST.
Предназначение массива $_SESSION – хранение всех переменных сессии текущего пользователя. Мы подробно рассмотрим механизм сессий в соответствующем уроке.
Глобальные массивы очень удобны в работе, но злоупортеблять ими не стоит, особенно массивом $_SESSION. Если переменной нужна только в локальной области видимости – не надо её делать глобальной. Слишком большое количество "лишних" переменных сильно снижает быстродействие и эффективность скрипта.