Глава 2. Переменные и типы в PHP

Типы данных составляют основу любого языка программирования и являются средством, с помощью которого программист представляет разные типы информации. В РНР поддерживаются шесть основных типов данных:

Одним из столпов любого языка программирования является поддержка числовых данных. В РНР поддерживаются как целые, так и вещественные числа (двойной точности). Разные числовые форматы подробно описываются в следующих разделах.

Целые числа

Целое число не имеет дробной части и представляется последовательностью из одной или нескольких цифр. Примеры целых чисел: 5, 591, 52

Восьмеричная и шестнадцатеричная запись

В РНР поддерживается запись целых чисел в восьмеричной (по основанию 8) и шестнадцатеричной (по основанию 16) системах счисления. Восьмеричные числа начинаются с цифры 0, после которой следует серия цифр от 0 до 7. Примеры: 0422, 0534

Шестнадцатеричные целые числа имеют префикс или и могут состоять из цифр от 0 до 9 и букв от а (А) до f (F). Примеры: 0x3FF, 0x22abc

Вещественные числа

Вещественные числа (числа с плавающей точкой) отличаются от целых наличием дробной части. Они используются для представления значений, требующих повышенной точности, — например, температур или денежных величин. В РНР поддерживаются два вещественных формата: стандартная и научная (экспоненциальная) запись.

Стандартная запись

Стандартная запись удобна для представления типичных вещественных чисел — скажем, денежных величин. Примеры: 12.45, 98.6

Научная запись

Научная запись лучше подходит для представления очень больших и очень малых чисел — скажем, межпланетных расстояний или размеров атомов. Примеры: Зе8, 5.9736е24

Строковые значения

Строкой (string) называется последовательность символов, которая рассматривается как единое целое, но при этом обеспечивает доступ к отдельным символам. Примеры строк: thesaurus, 49ers, abc, &%/$#

Обратите внимание: в РНР не поддерживается символьный тип данных. Строковый тип может рассматриваться как единое представление для последовательностей, состоящих из одного или нескольких символов.

Строковое присваивание

Строки делятся на две категории в зависимости от типа ограничителя — они могут ограничиваться парой кавычек (" ") или апострофов (' '). Между этими категориями существуют два принципиальных различия. Во-первых, имена переменных в строках, заключенных в кавычки, заменяются соответствующими значениями, а строки в апострофах интерпретируются буквально, даже если в них присутствуют имена переменных,

Два следующих объявления дают одинаковый результат:

>< &
$food = "meatloaf";
$food = 'meatloaf';

Однако результаты следующих объявлений сильно различаются:

$sentence = "My favorite food is $food";
$sentence2 = 'My favorite food is $food';

Переменной $sentence присваивается строка My favorite food is meatloaf.

Обратите внимание: переменная $food автоматически интерпретируется. С другой стороны, переменной $sentence2 присваивается строка My favorite food is $food.

В отличие от переменной $sentence, в $sentence2 осталась не интерпретированная переменная $food. Различия обусловлены использованием кавычек и апострофов при присваивании переменным $sentence и $sentence2.

Прежде чем рассматривать второе фундаментальное различие между строками, заключенными в апострофы и в кавычки, необходимо познакомиться со служебными символами, используемыми в строках РНР. В РНР, как и в большинстве современных языков программирования, строки могут содержать служебные символы (например, символы табуляции или новой строки), перечисленные в табл. 2.1.

Таблица 2.1. Служебные символы в строках

ПоследовательностьСмысл
\nНовая строка
\rВозврат курсора
\tГоризонтальная табуляция
\\Обратная косая черта
\$Знак доллара
\"Кавычка
\[0-7]{1,3}Восьмеричная запись числа (в виде регулярного выражения)
\x[0-9A-Fa-f]{1,2}Шестнадцатиричная запись числа (в виде регулярного выражения)

Второе принципиальное различие заключается в том, что в строках, заключенных в кавычки, распознаются все существующие служебные символы, а в строках, заключенных в апострофы, — только служебные символы «\\» и «'». Следующий пример наглядно демонстрирует различия между присваиванием строк, заключенных в кавычки и апострофы:

$double_list = "item1\nitem2\nitem2";
$single_list = 'item1\nitem2\nitem2';

Если вывести обе строки в браузере, окажется, что строка в кавычках содержит внутренние символы новой строки, а в строке в апострофах последовательность \n выводится как обычные символы. Хотя многие служебные символы в браузерах несущественны, при форматировании для других условий они играют очень важную роль. Помните об этом, выбирая между кавычками и апострофами, и вам удастся избежать многих неожиданностей.

Синтаксис встроенной документации

Второй вариант синтаксиса ограничения строк, представленный в HTML4, называется встроенной документацией (here doc). В этом варианте синтаксиса строка начинается с символов <<<, за которыми следует некоторый идентификатор по вашему выбору, затем строка, присваиваемая переменной. Конструкция заканчивается вторым экземпляром того же идентификатора. Пример:

$paragraph = <<<DELIM
    This is a string that
    Will be interpreted exactly
    As it is written in the
    variable assignment,
DELIM;

Выбранный идентификатор не должен присутствовать в присваиваемой строке. Более того, первый символ завершающего идентификатора должен находиться в первом столбце строки, завершающей конструкцию.

Обращение к отдельным символам строк

К отдельным символам строки можно обращаться как к элементам массива с последовательной нумерацией (см. следующий раздел). Пример:

$sequence_number = "04efgh";
$letter = $sequence_number[4];

Переменной $letter будет присвоено значение g. Как вы узнаете из следующего раздела, в РНР нумерация элементов массивов начинается с 0. Соответственно, выражение $sequence_number[l] будет равно 4.

Массивы

Массив представляет собой список однотипных элементов. Существует два типа массивов, различающиеся по способу идентификации элементов. В массивах первого типа элемент определяется индексом в последовательности. Массивы второго типа имеют ассоциативную природу, и для обращения к элементам используются ключи, логически связанные со значениями. Впрочем, на практике операции с массивами обоих типов выполняются сходным образом. По размерности массивы делятся на одномерные и многомерные.

Одномерные индексируемые массивы

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

Обобщенный синтаксис элементов одномерного массива:

$имя[индекс1];

Одномерные массивы создаются следующим образом:

$meat[0] = "chicken";
$meat[1] = "steak";
$meat[2] = "turkey";

При выполнении следующей команды:

print $meat[1];

в браузере выводится строка steak.

При создании массивов также можно воспользоваться функцией array(). Массив $meat из предыдущего примера создается командой:

$meat = array("chicken", "steak", "turkey");

Приведенная выше команда print приводит к тому же результату — выводу строки steak.

Чтобы включить новый элемент в конец массива, можно просто присвоить значение переменной массива без указания индекса. Следовательно, массив $meat можно создать еще одним способом:

$meat[] = "chicken";
$meat[] = "steak";
$meat[] = "turkey";

Одномерные ассоциативные массивы

Ассоциативные массивы особенно удобны в ситуациях, когда элементы массива удобнее связывать со словами, а не с числами.

Предположим, вы хотите сохранить в массиве лучшие сочетания вин и блюд. Проще всего было бы хранить в массиве пары «ключ/значение» — например, присвоить сорт вина названию блюда. Самым разумным решением будет использование ассоциативного массива:

$pairings["zinfandel"] = "Broiled Veal Chops";
$pairings["merlot"] = "Baked Ham";
$pairings["sauvignon"] = "Prime Rib";
$pairings["sauternes"] = "Roasted Salmon";

Ассоциативный массив заметно экономит время и объем программного кода, необходимого для вывода определенных элементов массива. Допустим, вы хотите узнать, с каким блюдом лучше всего идет «Мерло». Нужная информация выводится простой ссылкой на элемент массива $pairings:

print $pairings["merlot"]; // Выводится строка "Baked Ham"

Ассоциативные массивы также можно создавать функцией РНР array():

$pairings = array(
    "zinfandel" => "Broiled Veal Chops",
    "merlot" => "Baked Ham",
    "sauvignon" => "Prime Rib",
    "sauternes" => "Roasted Salmon"
);

Отличается только способ создания массива $pairings, а функциональные возможности остаются без изменений.

Многомерные индексируемые массивы

Многомерные индексируемые массивы работают практически так же, как и их одномерные прототипы, однако элементы в них определяются несколькими индексами вместо одного. Теоретически размерность индексируемого массива не ограничивается, хотя в большинстве приложений практически не встречаются массивы с размерностью выше 3.

Обобщенный синтаксис элементов многомерного массива:

$имя[индекс1][индекс2]...[индексN];

Пример ссылки на элемент двухмерного индексируемого массива:

$position = $chess_board[5][4];

Многомерные ассоциативные массивы

Многомерные ассоциативные массивы также существуют в РНР (и приносят определенную пользу). Допустим, в массиве $pairings из предыдущего примера должна храниться информация не только о сорте, но и о производителе вина. Это можно сделать следующим образом:

$pairings["Martinelli"]["zinfandel"] = "Broiled Veal Chops";
$pairings["Beringer"]["merlot"] = "Baked Ham";
$pairings["Jarvis"]["sauvignon"] = "Prime Rib";
$pairings["Climens"]["sauternes"] = "Roasted Salmon";

Смешанное индексирование

В многомерных массивах допускается смешанное индексирование (числовое и ассоциативное). Допустим, вы хотите расширить модель одномерного ассоциативного массива для хранения информации об игроках первого и второго состава футбольной команды. Решение может выглядеть следующим образом:

$Buckeyes["quarterback"][1] = "Bellisari";
$Buckeyes["quarterback"][2] = "Moherman";
$Buckeyes["quarterback"][3] = "Wiley";

В РНР существует множество функций для создания массивов и операций с ними — эта тема настолько обширна, что заслуживает отдельной главы. Работа с массивами в РНР подробно описана в главе 5.

Объекты

К пятому типу данных РНР относятся объекты. Объект представляет собой переменную, экземпляр которой создается по специальному шаблону, называемому классом. Концепции объектов и классов являются неотъемлемой частью парадигмы объектно-ориентированного программирования (ООП).

В отличие от других типов данных, поддерживаемых в языке РНР, объекты должны объявляться явно. Необходимо понимать, что объект — всего лишь конкретный экземпляр класса, используемого в качестве шаблона для создания объектов с конкретными характеристиками и функциональными возможностями. Следовательно, объявление класса должно предшествовать объявлению объектов, создаваемых на их основе. Пример объявления класса и последующего создания объектов на его основе:

class appliance {
    var $power;
    function set_power($on_off) {
        $this->power = $on_off;
    }
}
...
$blender = new appliance;

Определение класса задает атрибуты и функции, связанные с некоторой структурой данных — в данном примере это структура с именем appliance (устройство). У этой структуры имеется всего один атрибут power (мощность). Для изменения этого атрибута создается метод set_power.

Помните: определение класса — всего лишь шаблон, и выполнять операции с ним в программе невозможно; сначала нужно создать объекты на основе этого шаблона. Объекты создаются при помощи ключевого слова new. Например, в приведенном выше фрагменте создается объект $blender класса appliance.

После создания объекта $blender можно задать его мощность при помощи метода set_power:

$blender->set_power("on");

Объектно-ориентированное программирование занимает столь важное место в современных стандартах программирования, что его применение в РНР заслуживает отдельной главы. Реализация ООП в РНР описана в главе 6.

Логические величины (истина/ложь)

Логический тип данных принимает всего два значения: истинное (true) и ложное (false). Логические величины создаются двумя способами: при проверке условий и в виде значений переменных. Обе ситуации достаточно просты.

Сравнения существуют в нескольких формах. Чаще всего они встречаются при использовании оператора == в условной команде if. Пример:

if ($sum == 40) {
    ...
}

Результатом проверки является либо истина, либо ложь: переменная $sum либо равна 40, либо не равна. Если переменная $sum равна 40, проверка дает истинный результат. В противном случае результат равен false.

Логические величины также могут определяться явным присваиванием переменной истинного или ложного значения. Пример:

$flag = TRUE;
if ($flag == TRUE) {
    print "The flag is true!";
} else {
    print "The flag is false!";
}

Если переменная $flag истинна, выводится первое сообщение, а если ложна — второе сообщение.

Возможен и другой вариант — представление истинных и ложных логических величин в виде значений 1 и 0 соответственно. В этом случае предыдущий пример выглядит так:

$flag = 1;
if ($flag == TRUE) {
    print "The flag is true!";
} else {
    print "The flag is false!";
}

Наконец, существует еще один способ:

$flag = TRUE;
// При выполнении этой команды косвенно проверяется условие "if ($flag == TRUE)"
if ($flag) {
    print "The flag is true!";
} else {
    print "The flag is false!";
}

Идентификаторы

Общий термин "идентификатор" применяется к переменным, функциям и другим объектам, определяемым пользователем. Идентификаторы в PHP должны удовлетворять нескольким условиям:

Примеры:

Допустимые идентификаторыНедопустимые идентификаторы
my_functionThis&that
Size!counter
_someword4ward

В идентификаторах учитывается регистр символов. Таким образом, переменная с именем $recipe отличается от переменных с именами $Recipe, $rEciPe и $recipE.

Длина идентификаторов не ограничивается. Это позволяет программисту точно описать смысл идентификатора в его имени.

Идентификатор не может совпадать с каким-либо из стандартных ключевых слов PHP.

Переменные

В представленных выше примерах показано, как происходит присваивание и изменение значений переменных. Тем не менее, важно чётко определить правила объявления переменных и операций с ними. Ниже представлено детальное описание этих правил.

Объявление переменных

Переменная — это именованная область памяти, содержащая данные, с которыми можно работать во время выполнения программы. Имена переменных всегда начинаются со знака доллара, $. Примеры допустимых имен переменных:

Имена переменных должны соответствовать тем же условиям, что и идентификаторы. То есть, имя переменной начинается с буквы или символа подчеркивания и состоит из букв, символов подчеркивания, цифр или других ASCII-символов в интервале от 127 до 255.

Стоит отметить, что переменные в PHP, аналогично языку Perl, не требуют явного объявления. Переменная объявляется при первом её использовании в программе. Тип переменной определяется неявно, на основе хранящихся в ней данных:

Переменные могут быть объявлены в любом месте сценария PHP, однако их область видимости зависит от места объявления.

Область видимости переменных

Область видимости переменной определяет, в какой части программы она доступна. В PHP переменные классифицируются на основе их области видимости на четыре типа:

Локальные переменные

Локальной считается переменная, объявленная внутри функции. Она доступна только внутри этой функции. Присваивание значения такой переменной вне функции будет создавать новую переменную с тем же именем, но не связанной с оригиналом. После выхода из функции локальная переменная и её значение удаляются.

Основное преимущество локальных переменных заключается в избежании случайных изменений глобальной переменной. Рассмотрим пример:

$х = 4;

function assignx() {
    $х = 0;
    print "\$x inside function is $x. <br>";
}

assignx();
print "\$x outside of function is $x. <br>";

Результатом выполнения будет:

$х inside function is 0.
$х outside of function is 4.

Таким образом, переменная $х в функции и вне её имеют разные значения, так как внутри функции используется локальная переменная.

Параметры функций

Параметры функций в PHP передаются в заголовке функции. Несмотря на то что значения параметров приходят извне, после завершения функции они становятся недоступными. Параметры указываются в круглых скобках после имени функции, и их объявление аналогично обычной переменной. Например:

// Функция умножает переданное значение на 10 и возвращает результат
function x10($value) {
    $value = $value * 10;
    return $value;
}

Хотя внутри функции к параметрам можно обращаться и модифицировать их, после завершения функции они уничтожаются.

Глобальные переменные

Глобальные переменные доступны в любой части программы, в отличие от локальных. Однако, чтобы изменить значение глобальной переменной внутри функции, её следует явно объявить как глобальную с использованием ключевого слова GLOBAL. Рассмотрим пример:

$somevar = 15;

function addit() {
    GLOBAL $somevar;
    $somevar++;
    print "Somevar is $somevar";
}

addit();

После выполнения кода будет выведено значение $somevar, равное 16. Если бы мы пропустили строку GLOBAL $somevar;, то $somevar был бы рассмотрен как локальная переменная для функции addit(). По умолчанию локальные переменные инициализируются значением 0, поэтому результатом станет значение 1.

Есть и другой метод объявления глобальных переменных — с помощью массива PHP $GLOBALS. Давайте рассмотрим этот метод на примере с переменной $somevar:

$somevar = 15;

function addit() {
    $GLOBALS["somevar"]++;
}

addit();
print "Somevar is $somevar";

Независимо от метода объявления глобальных переменных, следует помнить о потенциальных рисках их использования. Неаккуратное применение глобальных переменных может привести к непредсказуемым результатам и ошибкам в программе. Хоть глобальные переменные и удобны, необходимо использовать их с осторожностью.

Статические переменные

Статические переменные представляют собой особый тип переменных, сохраняющих своё значение между вызовами функции. В отличие от обычных переменных, которые сбрасывают своё значение после завершения функции, статические переменные сохраняют своё состояние, что позволяет им аккумулировать или сохранять информацию при многократном вызове функции.

Для объявления статической переменной используется ключевое слово STATIC перед именем переменной:

STATIC $somevar;

Приведём пример функции, демонстрирующей особенности статической переменной:

function keep_track() {
    STATIC $count = 0;
    $count++;
    print $count;
    print "&ltbr>";
}

keep_track();
keep_track();
keep_track();

При отсутствии ключевого слова STATIC каждый вызов функции выводил бы значение 1. Однако, благодаря использованию статической переменной, результаты вызова функции будут следующими:

1
2
3

Статические переменные находят применение в рекурсивных функциях, где они помогают сохранять состояние между рекурсивными вызовами. Рекурсивные функции и их применение рассматриваются в главе 4.

Переключение типов

В работе с переменными РНР иногда требуется изменить их тип или интерпретировать их по-разному. Например, возможна ситуация, когда нужно сложить строковое значение "15" и целое число 12. В РНР тип переменной может меняться автоматически или с использованием механизма явного преобразования. Этот процесс называется переключением типов. Рассмотрим это на примерах.

Допустим, вы складываете строку и целое число. Результат будет зависеть от содержимого строки. Если строка представляет собой число, то результатом сложения будет целое число:

$variable1 = 1;
$variable2 = "1";
$variable3 = $variable1 + $variable2;
// В $variable3 будет значение 2.

Если же мы складываем целое число и вещественное, то целое число будет преобразовано в вещественное, чтобы сохранить точность:

$variable1 = 3;
$variable2 = 5.4;
$variable3 = $variable1 + $variable2;
// $variable3 будет равно 8.4.

Теперь рассмотрим интересный случай. Что произойдёт, если попытаться сложить целое число и строку, начинающуюся с числа, но содержащую и текст?

$variable1 = 5;
$variable2 = "100 bottles of beer on the wall";
$variable3 = $variable1 + $variable2;
// В $variable3 будет значение 105.

Такое поведение объясняется тем, что РНР анализирует начало строки и определяет тип данных на основе первых символов. Если же строка начинается не с числа, то она интерпретируется как 0:

$variable2 = "There are 100 bottles of beer on the wall";
$variable3 = $variable1 + $variable2;
// В $variable3 будет значение 5.

Большинство операций с переменными в РНР происходят корректно благодаря автоматическому переключению типов. Однако в некоторых случаях может потребоваться явное приведение типов, что будет рассмотрено в следующем разделе.

Преобразование типов

В РНР существует возможность явного преобразования переменной к другому типу, это называется преобразованием типа. Преобразование может быть временным или постоянным.

Для временного преобразования переменной к другому типу используются операторы преобразования, где нужный тип указывается перед именем переменной в круглых скобках. Рассмотрим их подробнее.

Таблица операторов преобразования типа переменных:

Оператор преобразования типаНовый тип
(int) или (integer)Целое число
(real), (double) или (float)Вещественное число
(string)Строка
(array)Массив
(object)Объект

Давайте рассмотрим на примере:

$variable1 = 13;
$variable2 = (double) $variable1;
// $variable2 будет равно 13.0

В этом примере переменной $variable1 присваивается целое число 13, но благодаря преобразованию (double) это число становится вещественным и равно 13.0. Полученное значение присваивается переменной $variable2.

$variable1 = 4.0;
$variable2 = 5;
$variable3 = (int) $variable1 + $variable2;
// $variable3 будет равно 9

Стоит учесть, что преобразование вещественного числа к целому всегда округляется:

$variable1 = 14.7;
$variable2 = (int) $variable1;
// $variable2 будет равно 14

Также есть возможность преобразовать переменную другого типа в элемент массива. При этом преобразованная переменная станет первым элементом массива:

$variable1 = 1114;
$array1 = (array) $variable1;
print $array1[0];
// Выведет значение 1114

Для преобразования любого типа данных в объект используется следующий метод:

$model = "Toyota";
$new_obj = (object) $model;
print $new_obj->scalar;

В этом случае переменная становится атрибутом объекта с именем scalar.

Присваивание

Вы уже ознакомились с тем, как присваивать значение переменной в РНР. Однако стоит углубиться в некоторые тонкости этого процесса. Большинство разработчиков знакомы с присваиванием по значению, когда переменной присваивается конкретное значение, такое как целое число 1 или строка "ciao". Но помимо этого существует и другой метод: присваивание по ссылке, который предоставляет программистам дополнительные возможности. Давайте рассмотрим оба этих метода подробнее.

Присваивание по значению

Этот метод - наиболее общепринятый способ задания значения переменной. При его использовании значение напрямую сохраняется в области памяти, ассоциированной с именем переменной. Вот примеры такого присваивания:

$vehicle = "car";
$amount = 10.23;

После выполнения данных команд, по адресу, связанному с переменной $vehicle, будет храниться строка "car", а по адресу, связанному с переменной $amount, будет сохранено значение 10.23.

Такой тип присваивания также может происходить при возврате значения из функции с помощью команды return:

function simple() {
    return 5;
}

$return_value = simple();

Функция simple() просто возвращает число 5, которое затем присваивается переменной. В данном случае значение 5 будет сохранено в переменной $return_value.

Присваивание по ссылке

Другой метод — это присваивание переменной ссылки на область памяти другой переменной. Таким образом, вместо прямого значения, переменная-приемник получает ссылку на эту область памяти, и фактическое копирование значения не происходит.

Чтобы выполнить присваивание по ссылке, используйте символ & перед именем переменной-источника:

$dessert = "cake";
$dessert2 = &$dessert; // Присваивание по ссылке
$dessert2 = "cookies"; // Изменяем $dessert2
print "$dessert2<br>"; // Выведет "cookies", так как $dessert2 была изменена
print "$dessert<br>"; // Также выведет "cookies", так как $dessert связана с $dessert2 по ссылке

Как видно из приведенного примера, после связывания переменной $dessert2 со ссылкой на $dessert, любые изменения в $dessert2 автоматически отражаются на $dessert (и на всех других переменных, которые ссылаются на эту же область памяти).

Переменные в переменных

В некоторых ситуациях бывает удобно использовать переменные, содержимое которых может динамически интерпретироваться как имя другой переменной. Рассмотрим типичный случай присваивания:

$recipe = "spaghetti";

Оказывается, строку "spaghetti" можно интерпретировать как имя переменной — для этого в команде присваивания перед именем исходной переменной ставится второй знак $:

$$recipe = " & meatballs";

Эта команда присваивает строку " & meatballs" переменной с именем "spaghetti". Следовательно, следующие две команды выводят одинаковые результаты:

print $recipe . $spaghetti;
print $recipe . $($recipe);

В обоих случаях будет выведена строка "spaghetti & meatballs".

Стандартные переменные

В PHP поддерживается ряд стандартных переменных, предоставляющих в распоряжение программиста довольно подробную информацию о внутренней конфигурации. Значения одних переменных задаются PHP, другие изменяются в зависимости от операционной системы и web-сервера, с которыми работает PHP.

Вместо подробного описания всех стандартных переменных я выделю лишь те переменные и функции, которые используются на практике многими программистами.

Чтобы получить полный список переменных web-сервера, окружения и PHP, определенных для вашей конфигурации системы, достаточно выполнить следующий фрагмент:

while (list($var,$value) = each($GLOBALS)) :
    echo "<br>$var => $value";
endwhile;

В результате выводится список наподобие приведенного ниже. Потратьте немного времени на просмотр полученных данных, а затем разберите приведенные примеры.

$GLOBALS =>
HTTP_GET_VARS => Array
HTTP_COOKIE_VARS => Array
HOSTSIZE => 1000
HOSTNAME => server1.apress.com
LOGNAME => unstrung
HISTFILESIZE => 1000
REMOTE_HOST => apress.com
MAIL => /var/spool/mail/apress
MACHTYPE => 1386
TERM => vt100
HOSTTYPE => i386-linux
PATH => /usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/Java/bin
HOME => /root
INPUTRC => /etc/inputrc
SHELL => /bin/csh
USER => nobody
VENDOR => intel
GROUP => root
HOST => server1.apress.com
OSTYPE => linux
PWD => /www/bin
SHLVL => 3 => /www/bin/httpd
DOCUMENT_ROOT => /usr/local/apress/site.apress
HTTP_ACCEPT => */*
HTTP_ACCEPT_ENCODING => gzip, deflate
HTTP_ACCEPT_LANGUAGE => it.en-us;q=0.5
HTTP_CONNECTION => Keep-Alive
HTTP_HOST => www.apress.com
HTTP_USER_AGENT => Mozilla/4.0 (compatible; MSIE 5.0: Windows 98; CNETHomeBuild051099)
REMOTE_ADDR => 127.0.0.1
REMOTE_PORT => 3207
SCRIPT_FILENAME => /usr/local/apress/site.apress/j/environment_vars.php
SERVER_ADDR => 127.0.0.1
SERVER_ADMIN => admin@apress.com
SERVER_NAME => www.apress.com
SERVER_PORT => 80
SERVER_SIGNATURE => Apache/1.3.12 Server at www.apress.com Port 80
SERVER_SOFTWARE => Apache/1.3.12 (Unix) PHP/4.0.1
GATEWAY_INTERFACE => CGI/1.1
SERVER_PROTOCOL => HTTP/1.1
REQUEST_METHOD => GET
QUERY_STRING =>
REQUEST_URI => /j/environment_vars.php
SCRIPT_NAME => /j/environment_vars.php
PATH_TRANSLATED => /usr/local/apress/site.apress/j/environment_vars.php
PHP_SELF => /j/environment_vars.php
argv => Array
argc => 0
var => argc
value => argc

Как видите, стандартные переменные содержат разнообразные сведения — как полезные, так и не очень. Вы можете вывести любую из этих переменных по имени. Например, следующая команда выводит IP-адрес пользователя:

print "Hi! Your IP address is: $REMOTE_ADDR";

IP-адрес выводится в числовой форме (например, 208.247.106.187).

Кроме того, стандартные переменные могут использоваться для сбора информации о браузере и операционной системе пользователя. Команда:

print "Your browser is: $HTTP_USER_AGENT";

возвращает информацию следующего вида:

Your browser is: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; CNETHomeBuild051099)

Информация о браузере и операционной системе, в которой он работает, может пригодиться при построении страниц, рассчитанных на специфические форматы конкретных браузеров.

Для работы с массивами стандартных переменных необходимо включить директиву track_vars в файл php.ini. В PHP версии 4.0.3 директива track_vars включена постоянно.

Константы

Константой называется именованная величина, которая не изменяется в процессе выполнения программы. Константы особенно удобны при работе с заведомо постоянными величинами — например, числом π (3,141592) или количеством футов в миле (5280).

В PHP константы определяются функцией define(). После того как константа будет определена, вы не сможете изменить (или переопределить) ее в этой программе.

Например, определение числа π в сценарии PHP может выглядеть так:

define("PI", "3.141592");

Определенную константу можно использовать в программе:

print "The value of pi is " . PI . "<br>";
$pi2 = 2 * PI;
print "Pi doubled equals $pi2.";

Результат работы этого фрагмента будет таким:

The value of pi is 3.141592.
Pi doubled equals 6.283184.

В этом фрагменте следует обратить внимание на два обстоятельства. Во-первых, в именах констант не указывается знак доллара. Во-вторых, константу невозможно модифицировать (например, присвоить ей величину 2*РI); если константа используется в вычислениях, то результат приходится сохранять в другой переменной.

Итоги

В этой главе был изложен довольно обширный материал, необходимый для понимания и самостоятельного написания простых программ на PHP. В частности, мы рассмотрели следующие темы:

Этот материал закладывает основу для создания более сложных сценариев. В следующей главе мы перейдем к подробному изучению выражений, операторов и управляющих конструкций языка PHP. К концу главы 3 ваших новых знаний хватит для того, чтобы построить первое приложение PHP — простейший календарь.