PHP-4 Эффективная работа


Константы
Переменные
Ссылки

В этой главе мы рассмотрим вопросы, связанные с использованием в РНР констант, переменных и ссылок.

4.1.Константы

В РНР определено довольно большое количество разнообразных констант, определенных в самом языке, а также предусмотрен механизм создания пользовательских констант. По большому счету, константы не слишком отличаются от переменных, за исключением невозможности их последующего переопределения, а также того, что они вводятся с помощью функции 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_, "Случилось стра-а-а-ашное...");

4.2. Переменные

Переменные в 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 ADDRIP-адрес клиента, запрашивающего доступ к странице. Может использоваться в качестве одного из контрольных средств, регламентирующих доступ к отдельным страницам
$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)

назад
далее

Сайт управляется системой uCoz