Константы
Переменные
Ссылки
В этой главе мы рассмотрим вопросы, связанные с использованием в РНР констант, переменных и ссылок.
В РНР определено довольно большое количество разнообразных констант, определенных в самом языке, а также предусмотрен механизм создания пользовательских констант. По большому счету, константы не слишком отличаются от переменных, за исключением невозможности их последующего переопределения, а также того, что они вводятся с помощью функции def i ne ( ).
В табл. 4.1 перечислены предопределенные константы, доступные для использования в любой момент времени.
Таблица 4.1. Предопределенные константы РНР
Константа | Значение
| _FILE_ | Имя анализируемой в данный момент программы. Если используется внутри файла, включенного в программу с помощью include или requi re, возвращается имя включенного, а не родительского файла
| _LINE_ | Номер текущей строки в анализируемом файле (не чувствительно к регистру). Если используется внутри включаемого файла, возвращается номер строки в этом файле
| PHP_VERSION | Строковое представление текущей версии анализатора РНР
| PHP_OS | Название операционной системы, в которой работает анализатор РНР. К числу возможных значений относятся, например: AIX, Darwin (MacOS), Linux, SunOS, WIN32, WINNT
| TRUE | Обозначает истинное логическое значение (не чувствительно к регистру)
| FALSE | Обозначает ложное логическое значение (не чувствительно к регистру)
| E_ERROR | Обозначает ошибочное состояние, не связанное с ошибкой разбора программы, в котором не возможно автоматическое восстановление состояния
| E_WARN ING | Обозначает состояние, при котором PHP-машина оповещается о наличии некоторой нештатной ситуации, которая позволяет продолжить выполнение программы. Такие ситуации обычно обрабатываются внутри самой программы
| E_PARSE | Анализатор обнаружил синтаксические ошибки в файле программы. Восстановление невозможно
| E_NOTICE | Произошло какое-то событие, которое может быть или не быть ошибкой. Выполнение программы продолжено. К числу событий этого класса относятся, например, использование строки, не закрытой кавычками, или попытка использования переменной, значение которой еще не установлено
| E_ALL | Объединяет все константы семейства Е_*. При использовании совместно с функцией error_reporting() (см. раздел 14.2.2) приведет к генерации сообщений о любых ошибках и предупреждениях РНР-машины
|
примечание
Константы семейства Е_* обычно используются функцией error_reporting() для включения или отключения генерации сообщений об ошибках различных степеней важности.
Более подробно эти вопросы рассматриваются в главе 15.
Вы можете также определять свои собственные константы с помощью функции
define ( ). При этом вы должны помнить, что это константы, а не макросы в стиле
Си, поэтому константа может представлять собой только скаляр, то есть число,
строку, адрес и т. д.
Вот как вы можете определить и использовать свою собственную константу:
<?php
def ine ("CONSTANT", "Всем привет!.");
echo CONSTANT; // напечатает "Всем привет!"
?>
А для использования предопределенных системных констант вам достаточно просто поместить их в исходный текст программы:
<?php
# Использование констант __FILE_ and _LINE_
function report_error($file, $line, $message) {
echo "Ошибка в строке $line файла $file: $message.";
}
report_error(__FILE_,_LINE_, "Случилось стра-а-а-ашное...");
Переменные в PHP по аналогии с Perl начинаются с символа доллара $, за которым следует собственно имя переменной. При этом, как в Perl и Си, имена переменных чувствительны к регистру символов.
Собственно говоря, имена переменных следуют тем же правилам, что и другие
имена в РНР. Правильное имя переменной начинается с буквы или символа подчеркивания, за которым следует произвольное количество букв, цифр или символов подчеркивания.
примечание
С помощью регулярных выражений вы можете проверить допустимость имени переменной, используя шаблон [a-zA-Z_\x7f-\xff][a-zA-ZO-9_\x7f-\xff]*. Как видите, никто не запрещает вам использовать русскоязычные переменные)
Вот как это может выглядеть на практике:
<?рhр
# /examples/php/part2.vars-def.php
# Определение и печать нескольких переменных
echo "<FONT SIZE=+2>"; // для более крупного изображения
$Фред = "Гомер Симпсон";
// под влиянием одной из серий,
// в которой Гомер выдавал себя за Фреда Флинтстоуна
$главный_хулиган = "Барт";
echo "Победителем в кабачке Мо сегодня стал $Фред!<р>";
echo " Угрозой общества является <b>$главный_хулиган</b>";
?>
Результат выполнения программы приведен на рис. 4.1
Рис. 4.1. Как и следовало ожидать, использование русскоязычных переменных
не оказывает влияния на результат выполнения РНР-программы
В предыдущей, третьей версии РНР присвоение переменным значений всегда осуществлялось только по значению. Иначе говоря, как только вы ставили знак равенства между некоторым выражением и переменной, то полное значение выражения
попросту копировалось в указанную вами переменную. По этой причине после
присвоения значения одной переменной другой последующие изменения одной из них не оказывали никакого влияния на значение второй.
В РНР 4 реализован также другой подход присвоения значений переменным - по ссылке. Это означает, что новая переменная ссылается (или становится синонимом) на первоначальную переменную. В результате изменения в новой переменной
оказывают влияние на первоначальную, и наоборот. Копирование значений не производится, а поэтому присвоение выполняется быстрее, чем раньше.
Чтобы использовать присвоение значения по ссылке, необходимо просто приписать к началу имени исходной переменной символ &. Так, приведенная ниже программа пять раз напечатает одну и ту же строку:
<?php
# /examples/php/part2/reference.php
echo "<FONT SIZE=+1>";
$на_доске = "Я не буду прогуливать уроки!<br>";
$первая_строка = &$на_доске;
$вторая_строка = &$на_доске;
$третья_строка = &$вторая_строка;
$четвертая_строка = &$первая_строка;
$пятая_строка = &$третья_строка;
echo "$первая_строка $вторая_строка $третья_строка";
echo "$четвертая_строка $пятая_строка";
?>
А результат ее работы вы можете увидеть на рис. 4.2.
Рис. 4.2. Фактически мы пять раз печатаем содержимое одной переменной
Следует иметь в виду, что присвоение значения по ссылке может быть реализовано только для именованных переменных:
<?php
$foo = 25;
$bar = &$foo; // Это допускается
$bar = &(24 * 7); //А вот так делать нельзя!
function test() {
return 25;
}
$bar = &test(); // Неправильно!
?>
4.2.1. Предопределенные переменные
PHP-машина содержит достаточно большое количество заранее определенных
переменных. Большая часть этих переменных, как ни жаль, не может быть исчерпывающе описана в этой книге, поскольку зависит от версии и настроек сервера
WWW и от многих других факторов. Кроме того, часть переменных недоступна,
если PHP-машина вызывается из командной строки.
Впрочем, не все так плохо. Поскольку в основном я ориентируюсь на читателей,
работающих в Linux и использующих мои рекомендации по установке РНР, мы будем рассматривать вариант установки PHP-машины в виде модуля для сервера 1.3.6.
примечание
Версия выбрана исключительно для определенности. Она довольно часто используется
в дистрибутивах, но вам ведь все равно придется заменить ее на русский Apache...
совет
Вы можете получить полный список переменных с помощью функции phpinfo(), которую
мы рассматривали в главе 2.
4.2.2. Переменные сервера Apache
В этом разделе мы рассматриваем переменные, которые генерируются сервером
Apache (табл. 4.2). Конечно, при работе с другим сервером вы можете столкнуться
с другим набором переменных, но тут уж я вам ничем помочь не смогу. Однако
большая часть этих переменных относится к спецификации CGI 1.1, так что, по
всей вероятности, эту часть переменных вы встретите в любом сервере.
Таблица 4.2. Переменные сервера Apache
Переменная | Значение
| $GATEWAY_INTERFACE | Содержит версию спецификации CGI, которая поддерживается сервером. В большинстве случаев это строка CGI /1.1
| $SERVER_NAME | Содержит имя хоста сервера, на котором запущена PHP-программа. Если программа запущена на виртуальном сервере, в переменной будет содержаться значение, соответствующее имени этого виртуального хоста
| $SERVER_SOFTWARE | Строка идентификации сервера, возвращаемая в HTTP-заголовках по запросам клиента
| $SERVER_PROTOCOL | Название и номер версии информационного протокола, используемого для передачи запрашиваемых клиентом документов. Как правило, имеег значение НТТР/1. 0
| $REQUEST_METHOD | Содержит метод, используемый для доступа к странице. Может принимать значения GET, HEAD, POST, PUT
| $QUERY_STRING | Строка запроса, с помощью которой была запрошена данная страница
| $DOCUMENT_ROOT | Корневой каталог документов сервера, где запущена текущая программа. Извлекается из файла конфигурации сервера
| $HTTP_ACCEPT | Содержимое заголовка Accept: текущего запроса, если он используется
| $HTTP_ACCEPT_CHARSET | Содержимое заголовка Accept-Charset: текущего запроса (например, iso-8859-1, *, utf -8)
| $HTTP_ACCEPT_ENCODING | Содержимое заголовка Accept-Encoding: текущего запроса (например, gzip)
| $HTTP_ACCEPT_LANGUAGE | Содержимое заголовка Accept-Language: текущего запроса (например, en)
| tHTTP_CONNECTION | Содержимое заголовка Connection: текущего запроса (например, Keep-Alive)
| $HTTP_HOST | Содержимое заголовка Host: текущего запроса
| $HTTP_REFERER | Адрес страницы, с которой был осуществлен переход на текущую. Устанавливается программой-навигатором клиента и поддерживается далеко не всеми клиентскими программами
| $HTTP USER AGENT | Содержимое заголовка User_Agent: текущего запроса. Представляет собой строку, указывающую на используемую версию клиентской программы-навигатора, например Mozi II а/ 4.5 [en] (X11; U; Linux 2.4.1 i686). Среди всего прочего вы можете использовать это значение функцией get_browser ( ), чтобы генерировать код страницы, использующий особенности той или иной клиентской программы
| $REMOTE ADDR | IP-адрес клиента, запрашивающего доступ к странице. Может использоваться в качестве одного из контрольных средств, регламентирующих доступ к отдельным страницам
| $REMOTE_PORT 1 | Номер порта, используемого клиентской машиной для связи с WWW-сервером
| $SCRIPT_FILENAME | Абсолютное (полное) имя исполняемой вданный момент программы
| $SERVER_ADMIN | Значение, используемое в директиве SERVER_ADMIN конфигурационного файла httpd.conf. Если программа запущена на виртуальном сервере, возвращается значение, соответствующее этому виртуальному серверу
| $SERVER_PORT | Порт на сервере, используемый для передачи данных. Обычно, если системный администратор не страдает паранойей и вы не работаете с SSL, эта переменная имеет значение, равное 80
| $SERVER_SIGNATURE | Строка, в которой содержится номер версии сервера и имя виртуального хоста, которая добавляется к страницам, генерируемым сервером
| $PATH_TRAN SLATED | Путь доступа к текущей странице, ориентированный на файловую систему (а не на дерево документов), сформированный в результате отображения сервером дерева документов на реальную файловую систему
| $SCRIPT_NAME | Путь доступа ктекущей программе на РНР. Используется страницами, которые ссылаются сами на себя, например многофункциональными редакторами таблиц баз данных
| $REQUEST_URI | Унифицированный идентификатор ресурса, использований для доступа к данной странице (например, /index, html)
|
4.2.3. Переменные окружения
Эти переменные попросту импортируются из системного окружения в глобальное
пространство имен PHP-машины. Понятно, что их состав и значения полностью
определяются характеристиками операционной системы и используемой оболочки. А поскольку в UNIX вообще и в Linux в частности интенсивно используется не
меньше десятка различных оболочек, привести исчерпывающий список всех генерируемых ими переменных не представляется возможным.
Однако вы можете воспользоваться документацией к операционной системе или
функцией phpinfo().
4.2.4. Переменные РНР-машины
В этом разделе мы рассмотрим переменные, которые генерируются самой РНР-машиной (табл. 4.3). При этом переменные $HTTP_*_VARS доступны только в том
случае, если РНР компилировался с параметром use_track_vars. В этом случае
все эти переменные всегда установлены, даже если они представляют собой пустые массивы без значений.
примечание
В результате вредитель не может подставить в них какие-либо некорректные значения.
В случае компиляции машины с директивой register_globals эти переменные
становятся доступными в качестве глобальных, то есть вне связи с массивами
$HTTP_*_VARS. Этот механизм нужно использовать достаточно осторожно, ведь в то
время, как доступ к переменным в массивах$НТТР_*_VАRS защищен, обычные глобальные переменные окружения легко могут быть переопределены входными данными пользователя, что, как легко догадаться, приведет к неприятностям. Если вы
не можете отключить режим register_globals, вы должны позаботиться о проверке значений этих переменных, прежде чем использовать их.
Таблица 4.3. Переменные РНР-машины
Переменная | Значение
| $argv | Массив аргументов, передаваемых программе. Если программа на РНР запускается из командной строки, вы получаете Си-подобный интерфейс доступа к аргументам командной строки. При вызове CGI-программы методом GET в этой переменной содержится строка запроса
| $argc | Содержит количество аргументов командной строки, переданных программе при ее автономном запуске (из командной строки)
| $PHP_SELF | Имя файла исполняемой в данный момент программы относительно корня дерева документов сервера. Если РНР запускается из командной строки, эта переменная недоступна
| $HTTP_COOKIE_VARS | Ассоциативный массив переменных, переданных текущей программе как плюшки HTTP
| $HTTP_GET_VARS | Ассоциативный массив переменных, переданных текущей программе с помощью метода GET
| $HTTP_POST_VARS | Ассоциативный массив переменных, переданных текущей программе с помощью метода POST
| $HTTP_POST_FILES | Ассоциативный массив переменных, в которых содержится информация о файлах, загруженных с помощью метода HTTP POST
| $HTTP_ENV_VARS | Ассоциативный массив переменных, переданных текущей программе из родительского окружения
| $HTTP_SERVER_VARS | Ассоциативный массив переменных, переданных текущей программе от сервера HTTP. По большому счету, эти переменные аналогичны переменным Apache, рассмотренным выше (см. раздел 4.2.2)
|
|