root.elima.ru
Мертвечина
Статьи и книгиИнтернет-технологии и сетевое программирование

Глобальные массивы

Артемьев Сергей Игоревич

В PHP версии 4 и выше введено понятие "суперглобальных" массивов. Эти массивы содержат всю информацию о состоянии сервера и среды выполнения скрипта. Массивы доступны в любом месте скрипта без дополнительных объявлений, т.е. не надо использовать ключевое слово global.

Всего массивов девять. Имена всех массивов записываются заглавными буквами, а начинается имя всегда с "$_" (кроме массива $GLOBALS).

$GLOBALSМассив содержит ссылки на все переменные, объявленные в данном скрипте. Это ассоциативный массив, в котором имена переменных являются ключами.
$_SERVERМассив содержит все данные о настройках среды выполнения скрипта и параметры сервера.
$_GETСписок переменных, переданных скрипту методом GET, т.е. через параметры URL-запроса.
$_POSTСписок переменных, переданных скрипту методом POST.
$_COOKIEМассив содержит все cookies, которые сервер установил на стороне пользователя.
$_FILESСодержит список файлов, загруженных на сервер из формы.
$_ENVСодержит переменные окружения, установленные для всех скриптов на сервере.
$_REQUESTЭтот массив объединяет массивы $GET, $POST и $COOKIE. очень часто бывает удобен при обработке пользовательских запросов, но применять его для защищённой обработки данных не стоит.
$_SESSIONМассив содержит все переменные сессии текущего пользователя.

Просмотреть содержимое всех масивов можно в результате вызова функции phpinfo().

Рассмотрим примеры использования глобальных массивов.

$_SERVER

С помощью этого массива можно узнать практически всё о сервере, на котором исполняется скрипт. Например:

<?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"] могут быть не установлены (хотя один из них как правило присутствует).

$_GET и $_POST

В эти массивы помещаются данные, передаваемые скрипту извне (так называемый, пользовательский ввод). В принципе, пользователь может влиять только на эти два массива плюс массив файлов и 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

В массив $_COOKIE автоматически помещаются все cookies, которые получены от браузера. Механизм cookies мы подробно рассмотрим в соответствующем уроке. А пока вам достаточно запомнить, что есть глобальный массив, из которого в любое время можно узнать какие cookies установлены на стороне клиента.

$_REQUEST

Массив $_REQUEST объединяет три массива: $_POST, $_GET, $_COOKIES. В ранних версиях PHP сюда же входил массив $_FILES, но из соображений безопасности и производительности его исключили. Пользоваться массивом $_REQUEST очень удобно в случаях, когда нет разницы, каким методом был сделан запрос. Например, при постраничном выводе данных номер страницы можно передавать через URL ("index.php?page=3") методом GET, а можно через элемент формы методом POST. И в том и в другом случае переменная page попадёт в массив $_REQUEST.

$_SESSION

Предназначение массива $_SESSION – хранение всех переменных сессии текущего пользователя. Мы подробно рассмотрим механизм сессий в соответствующем уроке.

Глобальные массивы очень удобны в работе, но злоупортеблять ими не стоит, особенно массивом $_SESSION. Если переменной нужна только в локальной области видимости – не надо её делать глобальной. Слишком большое количество "лишних" переменных сильно снижает быстродействие и эффективность скрипта.