Глава 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 | | _someword | 4ward |
В идентификаторах учитывается регистрсимволов. Следовательно, переменная сименем $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 ваших новых знаний хватит для того,чтобы построить первое приложение РНР -простейший календарь. |