На главную Назад
Добро пожаловать, уважаемый посетитель!

 

Глава 2

Переменныеи типы данных

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

  • целые числа;
  • вещественные числа;
  • строки;
  • массивы;
  • объекты;
  • логические величины.

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

Целыечисла

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

5

591

52

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

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

0422

0534

Шестнадцатеричные целые числа имеютпрефикс 0х или 0Х и могут состоять из цифр от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 favoritefood is $food';

Переменной $sentence присваивается строка

My favorite food ismeatloaf.

Обратите внимание: переменная $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]{l,2}Шестнадцатиричная запись числа (в видерегулярного выражения)

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

$double_list = "item1\nitem2\nitem2";

$single_list = 'item1\nitem2\nitem2';

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

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

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

$paragraph = <<<DELIM

This is a string that

Will be interpretedexactly

As it is written in the

variable assignment,

DELIM;

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

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

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

$sequence_number = "04efgh";

$letter = Ssequence_number[4];

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

Массивы

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

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

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

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

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

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

$meat[0] = "chicken";

$meat[l] = "steak";

$meat[2] = "turkey";

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

print $meat[1]:

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

steak

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

$meat = аrrау("chicken", "steak", "turkey");

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

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

Smeat[] = "chicken";

$meat[] = "steak";

Smeat[] = "turkey";

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

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

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

Spairings["zinfandel"]= "Broiled Veal Chops";

$pairings["merlot"]= "Baked Ham";

$pairings["sauvignon"] = "Prime Rib";

$pairings["sauternes"] = "Roasted Salmon";

Ассоциативный массив заметно экономитвремя и объем программного кода,необходимого для вывода определенныхэлементов массива. Допустим, вы хотитеузнать, с каким блюдом лучше всего идет <Мерло>.Нужная информация выводится простойссылкой на элемент массива $pairings: print $pairings["merlot"];// Выводится строка "Baked Ham"Ассоциативные массивы также можносоздавать функцией РНР аггау():

Spairings = аrrау(

zinfandel => "Broiled Veal Chops",

merlot => "Baked Ham",

sauvignon => "Prime Rib",

sauternes => "Roasted Salmon");

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

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

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

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

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

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

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

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

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

$pairings["Martinelli"]["zinfandel"] = "Broiled VealChops";

$pairings["Beringer"]["merlot"] = "BakedHam";

$pairings["Jarvis"]["sauvignon"] = "PrimeRib";

$pairings["Climens"]["sauternes"] = "RoastedSalmon";

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

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

$Buckeyes["quarterback"] [1] = "Bellisari";

$Buckeyes["quarterback"] [2] = "Moherman":

$Buckeyes["quarterback"] [3] = "Wiley";

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

Объекты

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

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

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!";

endif;

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

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

$flag = 1;

if ($flag == TRUE) ;

print "The flag is true!";

else :

print "The flag is false!";

endif;

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

$flag = TRUE:

// При выполнении этой команды косвенно 

//проверяется условие "if ($flag == TRUE)"

if ($flag):

print "The flag is true!";

else :

print "The flag is false!";

endif:

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

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

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

Допустимыеидентификаторы

Недопустимыеидентификаторы

my_function

This&that

Size!counter
_someword4ward

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

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

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

Переменные

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

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

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

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

$соlоr

$operating_system

$_some_variable

$model

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

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

$sentence = "This is a sentence."; // $sentenceинтерпретируется как строка

$price = 42.99: // $price интерпретируется каквещественное число

$weight = 185; // $weight интерпретируется как целоечисло

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

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

Область видимости (scope)определяется как область доступностипеременной в той программе, в которой онабыла объявлена. В зависимости от областивидимости переменные РНР делятся на четыретипа:

  •  локальныепеременные;
  • параметры функций;
  • глобальные переменные;
  • статические переменные.

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

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

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

$х = 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.

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

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

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

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

// Функция умножает переданное значение на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 будет присвоенозначение 1, поскольку эта переменная будетсчитаться локальной по отношению к функцииaddit( ). Локальная переменная по умолчаниюинициализируется 0, а затем к нейприбавляется 1; таким образом, будетвыведено значение 1.

Альтернативный способ объявленияглобальных переменных связан сиспользованием массива РНР $GLOBALS( ). Давайтевернемся к предыдущему примеру ивоспользуемся этим массивом для объявленияглобальной переменной $somevar: $somevar = 15;

function addit() {

$GLOBALS["somevar"];

$somevar++;

}

addit();

print "Somevar is $somevar";

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

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

Последний тип видимости переменныхназывается статическим.Вотличие от переменных, объявленныхпараметрами и уничтожаемых при выходе изфункции, статическая переменная сохраняетсвое значение при повторном вызове. Дляобъявления статической переменной перед ееименем ставится ключевое слово STATIC:

STATIC $somevar;

Рассмотрим пример:

function keep_track() {

STATIC $count = 0;

$count++;

print $count;

print "<br>";

}

keep_track();

keep_track();

keep_track();

Как будут выглядеть результаты работыэтого сценария? Если бы переменная $count небыла объявленастатической (то есть являлась локальной),результат выглядел бы так:

1

1

1

Но поскольку переменная $count являетсястатической, при каждом вызове функциибудет сохраняться ее предыдущее значение,поэтому результат будет таким:

1

2

3

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

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

Иногда бывает удобно использоватьпеременные способами, не предусмотреннымипри их создании. Допустим, вам захочетсяприбавить строковое значение "15" кцелому числу 12. К счастью, тип переменныхРНР может изменяться и без использованиямеханизма явного преобразования. Этотпроцесс, независимо от того, выполняется лион прямо или косвенно, называется переключением(juggling) типов.Лучшевсего продемонстрировать сказанное наконкретных примерах.

Предположим, вы суммируете две величины -строку и целое число. Как вы думаете, что приэтом произойдет? Результат зависит отсодержимого строки. Например, присуммировании целого числа со строковымпредставлением числа будет получено целоечисло:

$variablel = 1;

$variable2 = "1";

$variable3 = $variablel + $variable2;

// $variable3 присваивается 4.

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

$variablel = 3;

$variable2 = 5.4;

$variable3 = $variablel + $variable2;

// $variablel интерпретируется каквещественное число.

// и $variable3 присваивается 8.4.

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

$variablel = 5;

$variable2 = "100 bottles of beer on the wall";

$variable3 = ;variable1 + $variable2;

// $variable3 присваивается 105

В результате переменной ;variable3присваивается значение 105. Это происходитиз-за того, что лексический анализатор РНРопределяет тип по началу строки. Допустим,мы привели переменную $variable2 к виду "There are100 bottles of beer on the wall". Поскольку алфавитныесимволы трудно интерпретировать как целоечисло, строка интерпретируется как 0, ипеременной $variable3 присваивается 5.

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

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

Явное приведение переменной к типу,отличному от того, который изначальнопредназначался для нее, называется преобразованием(casting)типа. Изменение типа может быть каквременным, одноразовым, так и постоянным.

Чтобы временно привести переменную кдругому типу, достаточно воспользоватьсяоператором преобразования типа - указатьнужный тип перед именем переменной вкруглых скобках (табл. 2.2).

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

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

Простой пример преобразования типов:

$variable1= 13; // $variable1 присваивается целоечисло 13

$variable2 = (double) $variable1; // $variable2присваивается 13.0

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

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

$variablel = 4.0;

$variable2 = 5;

$variable3 = (int) $variable1 + $variable2; // $variable3 = 9

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

$variablel = 14.7:

$variable2 = (int) $varlable1; // $variable2 = 14:

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

$variable1 = 1114;

$array1 = (array) $varable1;

print $array1[0]; // Выводится значение 1114

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

$model = "Toyota";

$new_obj = (object) $model;

Ссылка на исходное строковое значениевыглядит так:

print $new_obj->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 = $Sdessert;

$dessert2 = "cookies";

print "$dessert2 <br>"; // Выводится строкаcookies

print Sdessert; // Снова выводится строка cookies

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

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

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

$recipe = "spaghetti";

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

$$recipe = "& meatballs";

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

print $recipe $spaghetti;

print $recipe $($recipe);

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

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

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

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

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

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

REMOTEHOST => 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_ADOR => 127.0.0.1

REMQTE_PORT => 3207

SCRIPT_FILENAME => /usr/local/apress/site.apress/j/environment_vars.php

SERVER_ADDR => 127.0.0.1

SERVER_AOMIN => admin@apress.com

SERVER_NAME => www.apress.com

SERVERJORT => 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_TRANSLAETD => /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: Mozina/4.0 (compatible: MSIE 5.0; Windows 98:CNETHomeBuild051099)

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

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

Константы

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

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

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

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); если константа используется ввычислениях, то результат приходитсясохранять в другой переменной.

Итоги

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

  • допустимые типы данных (целые ивещественные числа, строки, массивы,объекты, логические величины);
  • идентификаторы;
  • переменные (объявление, область действия);
  • переключение типов;
  • преобразование типов;
  • присваивание значений переменным (позначению, по ссылке);
  • константы.

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