Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Red Hat Linux и другие RPM-based дистрибутивы (ASP, Mandrake.)




Поскольку, как уже говорилось, Red Hat-пакеты содержат уже скомпилированные бинарники, вам следует отыскать в интернете готовый rpm с наиболее подходящей вам конфигурацией, и установить его, воспользовавшись командой rpm.

Gentoo Linux

Gentoo-portage PHP (модуля Apache) находится в /usr/potrage/dev-php/mod_php. Для указания параметров configure используйте переменную USE (неполный список возможных значений USE в Gentoo Linux: www.gentoo.org/dyn/use-index.xml). Можно отредактировать etc/make.conf, но удобнее так:
# USE="gd mysql pdf xml xslt -X" emerge mod_php
В этом случае, переменная USE устанавливается только на время выполнения команды emerge. ("-X" - для гарантии, что ни одна библиотека не потащит за собой XFree86).

После установки, файл php.ini (а точнее - симлинк на него) находится в /etc/apache/conf.

III. Настройка Apache+PHP

Если это еще не сделала программа установки из пакетов/портов, добавьте в файл конфигурации Apache httpd.conf следующие строки:

· Для OS Windows:
LoadModule php4_module C:/php/sapi/php4apache.dll

· Для OS Unix:
после последней директивы LoadModule
LoadModule php4_module libexec/apache/libphp4.so

· Для всех ОС:
после последней директивы AddModule
AddModule mod_php4.c
Внутри блока <IfModule mod_mime.c>
AddType application/x-httpd-php.php
В строке DirectoryIndex пропишите index.php:
DirectoryIndex index.php index.html

Подключение расширений

В Windows, для подключения расширений следует раскомментировать соответствующие строки extension=... в php.ini, не забыв прописать путь к ним в строке extension_dir=.. (обычно они находятся в c:\php\extensions для php4 и в c:\php\ext для php5).

В Unix (если только вы не указывали атрибут shared параметров --with... при сборке), расширения подключаются путем пересборки php.

Настройки php.ini

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

register_globals = off
magic_quotes_gpc = off
magic_quotes_runtime = off
error_reporting = E_ALL - и именно так, никаких E_ALL & ~E_NOTICE и пр.!
display_errors = on

Запуск Apache

Теперь все готово к запуску Apache. В Windows:
> net start apache

В Unix:
# apachectl start

IV. Установка PHP5

Apache+PHP5 устанавливается точно так же, как и Apache+PHP4 - просто везде замените в этой инструкции PHP4 на PHP5 (в т.ч и в именах файлов и конфигурационных директивах).

В частности, для Windows/Apache/PHP5, в httpd.conf необходимо прописать:
LoadModule php5_module C:/php5/php5apache.dll
AddModule mod_php5.c
AddType application/x-httpd-php.php

 

Самоучитель PHP: Глава 3. Основы синтаксиса PHP

Содержание главы

Версия для печати

I. Как выглядит PHP-программа

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

III. Условные операторы

1. if

2. switch

IV. Циклы

1. while

2. do...while

3. for

V. Массивы

1. Цикл foreach

2. Конструкции list и each

VI. Константы

Как выглядит PHP-программа

В отличие от традиционных скриптовых языков (таких, как Perl), PHP-программа представляет собой HTML-страницу со вставками кода. Для сравнения:

Perl-скрипт:

#!/usr/local/bin/perlprint "Content-type: text/html\n\n";print "<html>\n<head><title>Hello World</title></head>\n";print "<body><h1>Hello World!</h1></body>\n";print "</html>";

PHP-скрипт (да-да, это программа на PHP;)):

<html><head><title>Hello World</title></head><body><h1>Hello World!</h1></body></html>

Как видите, простейшая программа на PHP - это обычная HTML-страница. О выводе заголовка Content-type: text/html PHP тоже позаботился самостоятельно.

Непосредственно PHP-код (который - не HTML:) размещается между тэгами <? и?>. Все, что расположено между этими тэгами, заменяется на выведенный скриптом внутри этого блока HTML-кодом (в частном случае - если скрипт ничего не выводит - просто "исчезает").

Вообще, универсальный (то есть - гарантированно работающий при любой конфигурации PHP), но более длинный способ спецификации PHP-кода - тэги <?php...?>. Такая длинная форма записи используется при совмещении XML и PHP, так как тэг <?...?> используется в стандарте XML.

За распознавание тэга <? как начала PHP-блока отвечает директива short_open_tag файла php.ini(по умолчению - включена). Если вы хотите разрабатывать скрипты, работающие независимо от данной настройки, используйте длинный открывающий тэг <?php. Я буду использовать сокращенную форму.

Рассмотрим простой пример.

1. <html>

2. <head><title>Hello World</title></head>

3. <body><h1>Hello World!</h1>

4. <p>Текущая дата:

5. <?

6. echo date("d.m.Y");

7.?>

8. </body>

9. </html>

Для выполнения примеров, скопируйте их в файл, расположенный в каталоге, соответствующий директиве DocumentRoot файла конфигурации Apache httpd.conf (например, в файл с именем test.php), и выполните их, обратившись к сохраненному скрипту (test.php) из адресной строки браузера (http://localhost/test.php). Ну а если вы еще не установили Apache+PHP (как же так?;), обратитесь к предыдущей главе.

Если сегодня - 27-е июля 2004 года, в результате исполнения скрипта браузер получит следующий HTML-код:

<html><head><title>Hello World</title></head><body><h1>Hello World!</h1><p>Текущая дата:27.07.2004</body></html>

Строки 5,6,7 - вставка PHP-кода. На строках 5 и 7 расположены соответственно открывающий и закрывающий тэг. Их совершенно необязательно располагать на отдельных строках - это сделано по соображениям удобства чтения.

В строке 6 расположен оператор echo, используемый для вывода в браузер. Выводит же он результат выполнения функции date - в данном случае это текущая дата.

Строка 6 является законченным выражением. Каждое выражение в PHP заканчивается точкой с запятой -;. Именно точкой с запятой, а не переводом строки - не забывайте об этом, особенно если вы раньше программировали на Visual Basic или ASP.

Внимательный читатель заметит, что тэг </body> расположен на той же строке, что и текст, сформированный функцией date(), хотя в исходном коде </body> находится на отдельной строке. Дело в том, что PHP отбрасывает перевод строки, следующий сразу после закрывающего тэга ?> - это сделано специально, чтобы в фрагментах HTML, где лишние пробелы нежелательны, не было необходимости жертвовать читабельностью скрипта, записывая закрывающий PHP-тэг на одной строке с последующим HTML-кодом. Если же пробел необходим - вставьте после ?> пустую строку.

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

Переменные в PHP начинаются со знака $, за которыми следует произвольный набор латинских букв, цифр и знака подчеркивания: _, при этом цифра не может следовать сразу за знаком $.

Регистр букв в имени переменной имеет значение: $A и $a - это две разные переменные.

Для присваивания переменной значения используется оператор =.

Пример:

1. <?

2. $a = 'test';

3. $copyOf_a = $a;

4. $Number100 = 100;

5. echo $a;

6. echo $copyOf_a;

7. echo $Number100;

8.?>

Данный код выведет: testtest100.

Следите за тем, какие имена вы даете переменным: вряд ли вы через полгода вспомните, для чего используется переменная $a21 или $zzz.:) А вот для чего используется переменная $username, понять довольно легко.

В строке 2 переменной $a присваивается строковое значение 'test'. Строки в PHP записываются в кавычках - одинарных или двойных (различие между записями в разных кавычках мы рассмотрим чуть позже). Также справедливо высказывание, что переменная $a инициализируется значением 'test': в PHP переменная создается при первом присваивании ей значения; если переменной не было присвоено значение - переменная не определена, то есть ее просто не существует.

В строке 3 переменная $copyOf_a инициализируется значением переменной $a; в данном случае (смотрим строку 2) это значение - строка 'test'. В строке с номером 4 переменной с именем $Number100 присваивается числовое значение 100.

Как видите, в PHP существует типизация, то есть язык различает типы данных - строки, числа и т.д. Однако, при этом PHP является языком со слабой типизацией - преобразования между типами данных происходят автоматически по установленным правилам. Например, программа <? echo '100' + 1;?> выведет число 101: строка автоматически преобразуется в число при использовании в числовом контексте (в данном случае - строка '100', при использовании в качестве слагаемого, преобразуется в число 100, так как операция сложения для строк не определена).

Такое поведение (а также отсутствие необходимости (и даже возможности) явно определять переменные) роднит PHP с Perl и Basic, однако, возможно, будет встречено в штыки приверженцами строгих языков, таких как Си и Pascal. Конечно, необходимость четкого определения переменных и требование явного приведения типов уменьшает число возможных ошибок программирования, однако, PHP, прежде всего, - интерпретируемый язык для быстрой разработки скриптов, и нестрогость синтаксиса с лихвой компенсируется скоростью кодинга. А о неинициализированной переменной PHP всегда услужливо сообщит - если, конечно, ему этого не запрещать... Впрочем, я забегаю вперед.

Рассмотрим еще один пример:

1. <?

2. $greeting = 'Привет';

3. $name = 'Вася';

4. $message = "$greeting, $name!";

5. echo $message;

6.?>

Особого внимания заслуживает четвертая строка. Внутри двойных кавычек указаны переменные, определенные в предыдущих строках. Если выполнить эту программу (вы ведь это уже сделали?:)), в окне браузера отобразится строка Привет, Вася!. Собственно, в этом и заключается основная особенность двойных кавычек: имена переменных, указанных внутри пары символов ", заменяются на соответствующие этим переменным значения.

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

· \r - возврат каретки (CR)

· \n - перевод строки (NL)

· \" - двойная кавычка

· \$ - символ доллара ($)

· \\ - собственно, обратный слэш (\)

Символы \r и \n обычно используются вместе, в виде комбинации \r\n - так обозначается перевод строки в Windows и многих TCP/IP-протоколах. В Unix новая строка обозначается одним символом \n; обычно такой способ перевода строки используется и в HTML-документах (конечно же, это влияет только на HTML-код, но не отображение в браузере (если только текст не заключен в пару тэгов <pre>...</pre>): для отображаемого перевода строки, как известно, используется тэг <br>).

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

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

Если в данном кавычки заменить на одинарные, в браузере отобразится именно то, что внутри них написано ($greeting, $name!). Комбинации символов, начинающиеся с \, в одинарных кавычках также никак не преобразуются, за двумя исключениями: \' - одинарная кавычка внутри строки; \\ - обратный слэш (в количестве одна штука:).

Немного изменим наш последний пример:

1. <?

2. $greeting = 'Привет';

3. $name = 'Вася';

4. $message = $greeting. ','. $name. '!';

5. echo $message;

6.?>

На этот раз мы не стали пользоваться "услужливостью" двойных кавычек: в строке 4 имена переменных и строковые константы записаны через оператор конкатенации (объединения строк). В PHP конкатенация обозначается точкой -.. Результат выполнения этой программы аналогичен предыдущему примеру.

Я рекомендую использовать именно этот способ записи - на то есть достаточно причин:

· Имена переменных более четко визуально отделены от строковых значений, что лучше всего заметно в редакторе с подсветкой кода;

· Интерпретатор PHP обрабатывает такую запись немного быстрее;

· PHP сможет более четко отследить опечатку в имени переменной;

· Вы не совершите ошибку, подобную следующей: $message = "$greetingVasya" - PHP в данном случае выведет не "ПриветVasya", а пустую строку, ибо $greetingVasya распознается как имя переменной, а таковой у нас нет.

Однако, двойные кавычки весьма популярны, и вы их наверняка встретите во множестве скриптов, доступных в сети.

Кстати, в последних двух примерах совершенно нет необходимости в определении переменной $message: строки 4 и 5 можно сократить до echo $greeting. ','. $name. '!';. Ну а если переменная $message нам может понадобиться в нижеследующем коде - можно написать echo $message = $greeting. ','. $name. '!';, и это сработает. Связано это с тем, что результатом выражения, содержащего присваивние, является присвоенное значение. Это особенно удобно при присваивании одного и того же значения нескольким переменным. Например, если переменным $a и $b нужно присвоить одно и то же значение (скажем, число с плавающей запятой 10.34), можно написать $a = $b = 10.34;.

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

Помимо строк и чисел, существует еще один простой, но важный тип данных - булевый (bool), к которому относятся два специальных значения: true (истина) и false (ложь). При автоматическом приведении типов, false соответствует числу 0 и пустой строке (''), true - всему остальному. Булевые значения часто применяются совместно с условными операторами, о которых мы дальше и поговорим.

Условные операторы

if

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

1. <?

2. $i = 10;

3. $j = 5 * 2;

4. if ($i == $j)

5. echo 'Переменные $i и $j имеют одинаковые значения';

6. else

7. echo 'Переменные $i и $j имеют различные значения';

8.?>

Здесь используется оператор if..else - условный оператор. В общем виде он выглядит так:
if (условие)
выражение_1;
else
выражение_2;

В данном случае, условием является результат сравнения значений переменных $i и $j. Оператор сравнения - == - два знака равенства. Поскольку 5*2 равняется 10, и, соответственно, 10 равняется 10;), выполнится строка 5, и мы увидим, что переменные имеют равные значения. Измените, например, строку 2 на $i = 11, и вы увидите, что выполнится оператор echo из строки 7 (так как условие ложно). Помимо ==, есть и другие операторы сравнения:
!= - не равно;
< - меньше;
> - больше;
<= - меньше или равно;
>= - больше или равно.

Поэкспериментируйте, изменяя оператор сравнения и значения переменных. (Для логической правильности вывода на экран, потребуется, конечно, изменить и тексты, выводимые операторами echo:)).

Не путайте оператор сравнения == с оператором присваивания =! Если вы допустите такую ошибку, условие всегда будет верным, если присваивается значение, соответствующее булевому true, и всегда ложным - если значение соответствует false. (См. выше о булевых значениях и чему они соответствуют).

Если требуется только выполнить действие, если условие выполняется, блок else...можно опустить:

1. <?

2. $i = 10;

3. $j = 5 * 2;

4. if ($i == $j)

5. echo 'Переменные $i и $j имеют одинаковые значения';

6.?>

В этом случае, если условие ложно, в браузер не выведется ничего.

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

1. <?

2. $i = 10;

3. $j = 11;

4. if ($i > $j)

5. $diff = $j - $i;

6. echo '$j больше, чем $i; разность между $j и $i составляет '. $diff; //НЕВЕРНО!

7.?>

Вопреки возможным ожиданиям, строка 6 выполнится, хотя условие ($i > $j) ложно. Дело в том, что к if(...) относится лишь следующее выражение - строка 5. Строка 6 же выполняется в любом случае - действие if(..) на нее уже не распространяется. Для получения нужного эффекта следует воспользоваться блоком операторов, который задается фигурными скобками:

1. <?

2. $i = 10;

3. $j = 11;

4. if ($i > $j) {

5. $diff = $j - $i;

6. echo '$j больше, чем $i; разность между $j и $i составляет '. $diff;

7. }

8.?>

Теперь все работает правильно.

Фигурные скобки можно использовать, даже если внутри - только один оператор. Я рекомендую поступать именно так - меньше шансов ошибиться. На производительности это никак не сказывается, зато повышает читабельность.

Часто нужно ввести дополнительные условия (если так... а если по-другому... иначе) или даже (если так.. а если по-другому.. а если еще по-другому... иначе):

1. <?

2. $i = 10;

3. $j = 11;

4. if ($i > $j) {

5. echo '$i больше, чем $j';

6. } else if ($i < $j) {

7. echo '$i меньше, чем $j';

8. } else { // ничего, кроме равенства, не остается:)

9. echo '$i равно $j';

10. }

11.?>

Для дополнительных "развилок" используется оператор if... else if... else. Как и в случае с if, блок else может отсутствовать. Следуя свой же недавней рекомендации, я заключил все операторы echo в фигурные скобки, хотя все бы прекрасно работало и без оных.

Кстати, в строке 8 - комментарий. Это информация для человека, PHP ее игнорирует. Комментарии бывают двух видов: однострочный, как здесь - начинается с // и распространяется до конца строки, и многострочный - комментарием считается все, что расположено между парами символов /* и */.

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

Switch

Бывает необходимость осуществления "развилки" в зависимости от значения одной и той же переменной или выражения. Можно написать что-то вроде:

if ($i==1) { // код, соответствующий $i==1 } else if ($i==2) { // код, соответствующий $i==2 } else if ($i==3) { // код, соответствующий $i==3... }

Но существует более удобный для этого случая оператор - switch. Выглядит это так:

1. <?

2. $i = 1;

3.

4. switch ($i) {

5. case 1:

6. echo 'один';

7. break;

8. case 2:

9. echo 'два';

10. break;

11. case 3:

12. echo 'три';

13. break;

14. default:

15. echo 'я умею считать только до трех!;)';

16. }

17.?>

Понаблюдайте за результатом выполнения программы, меняя значение $i во второй строке. Как вы уже наверняка поняли, после switch в скобках указывается переменная (хотя там может быть и выражение - например, $i+1 - попробуйте:)), а строки case XXX соответствуют значению того, что в скобках.

Операторы, находящиеся между case-ами, не нужно заключать в фигурные скобки - каждое ответвление заканчивается оператором break.

Специальное условие default соответствует "всему остальному" (аналог else в if...else if..else). default всегда располагется последним, так что break здесь необязателен. Как и в случае с else, условие default может отсутствовать.

Если вы вдруг забудете указать break, будут выполняться все последующие строки - из последующих case -ов! Например, если в нашем примере удалить строку 6, при $i==1 в браузер выведется " одиндва ". Некоторые чересчур хитрые программисты используют этот трюк для указания нескольких вариантов значений:

1. <?

2. $i = 1;

3.

4. switch ($i) {

5. case 0: // break отсутствует умышленно!

6. case 1:

7. echo 'ноль или один';

8. break;

9. case 2:

10. echo 'два';

11. break;

12. case 3:

13. echo 'три';

14. break;

15. }

16.?>

или для выполнения при определенном значении условия двух действий подряд. Но это уже ухищрения - лучше всего использовать switch "как положено", заканчивая каждый case своим break-ом; а если уж "ухищряетесь" - не забудьте поставить комментарий, как это сделано в строке 5 последнего примера.

Циклы

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

While

Начнем с цикла while:

1. <?

2. $i = 1;

3. while($i < 10) {

4. echo $i. "<br>\n";

5. $i++;

6. }

7.?>

Цикл while (строка 3) работает следующим образом. Сначала проверяется истинность выражения в скобках. Если оно не истинно, тело цикла (все, что расположено между последующими фигурными скобками - или, если их нет - следующая инструкция) не выполняется. Если же оно истинно, после выполнения кода, находящегося в теле цикла, опять проверяется истинность выражения, и т.д.

В теле цикла (строки 4,5) выводится текущее значение переменной $i, после чего значение $i увеличивается на единицу.

Переменную, используемую подобно $i в данном примере, часто называют переменной-счетчиком цикла, или просто счетчиком.

$i++, операция инкрементирования (увеличения значения на 1) - сокращенная запись для $i=$i+1; аналогичная сокращенная запись - $i+=1. По последнему правилу можно сокращать любые бинарные операции (например, конкатенация: $s.= 'foo' - аналог $s = $s. 'foo'); однако, аналогично инкрементированию можно записать только декрементирование (уменьшение значения на 1): $i--.

Возможна также запись ++$i (и --$i); различие в расположении знаков операции проявляется только при непосредственном использовании результата этого вычисления: если $i равна 1, в случае $j=$i++ переменная $j получит значение 1, если же $j=++$i, $j будет равняться двум. Из-за этой особенности операция ++$i называется преинкрементом, а $i++ - постинкрементом.

Если бы мы не увеличвали значение $i, выход из цикла никогда бы не произошел ("вечный цикл").

Запишем тот же пример в более краткой форме:

1. <?

2. $i = 1;

3. while($i < 10) {

4. echo $i++. "<br>\n";

5. }

6.?>

И еще один вариант:

1. <?

2. $i = 0;

3. while(++$i < 10) {

4. echo $i. "<br>\n";

5. }

6.?>

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

Do..while

Цикл do..while практически аналогичен циклу while, отличаясь от него тем, что условие находится в конце цикла. Таким образом, тело цикла do..while выполняется хотя бы один раз.

Пример:

1. <?

2. $i = 1;

3. do {

4. echo $i. "<br>\n";

5. } while ($i++ < 10);

6.?>

For

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

1. <?

2. for ($i=1; $i<10; $i++) {

3. echo $i. "<br>\n";

4. }

5.?>

Как и в предыдущих примерах, этот скрипт выводит в браузер числа от 1 до 9. Синтаксис цикла for в общем случае такой:

for(выражение_1;выражение_2;выражение_3), где выражение_1 выполняется перед выполнением цикла, выражение_2 - условие выполнения цикла (аналогично while), а выражение_3 выполняется после каждой итерации цикла.

Запутались?;) Перепишем "общий случай" цикла for в переложении на цикл while:

for while
for (выражение_1; выражение_2; выражение_3) { тело_цикла } выражение_1; while (выражение_2) { тело_цикла выражение_3; }

Надеюсь, теперь все понятно.:) Точно понятно? Тогда разберитесь в этом цикле:

1. <?

2. $i=0;

3. for ($i++; --$i<10; $i+=2) {

4. echo $i. "<br>\n";

5. }

6.?>

Если долго разбирались - ничего страшного:) Цикл for чаще всего используется в более понятной форме - как в первом примере.

Операторы break и continue. Вложенные циклы

Может вознкнуть необходимость выхода из цикла при определенном условии, проверяемом в теле цикла. Для этого служит оператор break, с которым мы уже встречались, рассматривая switch.

1. <?

2. $i = 0;

3. while (++$i < 10) {

4. echo $i. "<br>\n";

5. if ($i == 5) break;

6. }

7.?>

Этот цикл выведет только значения от 1 до 5. При $i==5 сработает условный оператор if в строке 5, и выполнение цикла прекратится.

Оператор continue начинает новую итерацию цикла. В следующем примере с помощью continue "пропускается" вывод числа 5:

1. <?

2. for ($i=0; $i<10; $i++) {

3. if ($i == 5) continue;

4. echo $i. "<br>\n";

5. }

6.?>

Операторы break и continue можно использовать совместно со всеми видами циклов.

Циклы могут быть вложенными (как практически все в PHP): внутри одного цикла может располагаться другой цикл, и т.д. Операторы break и continue имеют необязательный числовой параметр, указывающий, к какому по порядку вложенности циклу - считая снизу вверх от текущей позиции - они относятся (на самом деле, break - это сокращенная запись break 1 - аналогично и с continue). Пример выхода из двух циклов сразу:

1. <?

2. for ($i=0; $i<10; $i++) {

3. for ($j=0; $j<10; $j++) {

4. if ($j == 5) break 2;

5. echo '$i='. $i. ', $j='. $j. "<br>\n";

6. }

7. }

8.?>

Массивы

Массив представляет собой набор переменных, объединенных одним именем. Каждое значение массива идентифицируется индексом, который указывается после имени переменной-массива в квадратных скобках. Комбинацию индекса и соответствующего ему значения называют элементом массива.

1. <?

2. $i = 1024;

3. $a[1] = 'abc';

4. $a[2] = 100;

5. $a['test'] = $i - $a[2];

6.

7. echo $a[1]. "<br>\n";

8. echo $a[2]. "<br>\n";

9. echo $a['test']. "<br>\n";

10.?>

В приведенном примере, в строке три объявляется элемент массива $a с индексом 1; элементу массива присваивается строковое значение 'abc'. Этой же строкой объявляется и массив $a, так как это первое упоминание переменной $a в контексте массива, массив создается автоматически. В строке 4 элементу массива с индексом 2 присваивается числовое значение 100. В строке же 5 значение, равное разности $i и $a[2], присваивется элементу массива $a со строковым индексом 'test'.

Как видите, индекс массива может быть как числом, так и строкой.

В других языках программирования (например, Perl) массивы, имеющие строковые индексы, называются хэшами (hash), и являются отдельным типом данных. В PHP же, по сути, все массивы являются хэшами, однако индексом может служить и строка, и число.

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

1. <?

2. $i = 1024;

3. $a = array(1=>'abc', 2=>100, 'test'=>$i-100);

4. print_r($a);

5.?>

Созданный в последнем примере массив $a полностью аналогичен массиву из предыдущего примера. Каждый элемент массива здесь задается в виде индекс => значение. При создании элемента 'test' пришлось указать значение 100 непосредственно, так как на этот раз мы создаем массив "одним махом", и значения его элементов на этапе создания неизвестны PHP.

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

Строки в выводе функции print_r разделяются обычным переводом строки \n, но не тэгом <br>. Для удобства чтения, строку print_r(..) можно окружить операторами вывода тэгов <pre>...</pre>:

echo '<pre>';
print_r($a);
echo '</pre>';

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

1. <?

2. $operating_systems = array('Windows', 'Linux', 'FreeBSD', 'OS/2');

3. $operating_systems[] = 'MS-DOS';

4.

5. echo "<pre>";

6. print_r($operating_systems);

7. echo "</pre>";

8.?>

Вывод:

Array([0] => Windows [1] => Linux [2] => FreeBSD [3] => OS/2 [4] => MS-DOS)

Здесь мы явно не указывали индексы: PHP автоматически присвоил числовые индексы, начиная с нуля. При использовании такой формы записи массив можно перебирать с помощью цикла for. Количество элементов массива возвращает оператор count (или его синоним, sizeof):

1. <?

2. $operating_systems = array('Windows', 'Linux', 'FreeBSD', 'OS/2');

3. $operating_systems[] = 'MS-DOS';

4.

5. echo '<table border=1>';

6. for ($i=0; $i<count($operating_systems); $i++) {

7. echo '<tr><td>'. $i. '</td><td>'. $operating_systems[$i]. '</td></tr>';

8. }

9. echo '</table>';

10.?>

Стили записи можно смешивать. Обратите внимание на то, какие индексы автоматически присваиваются PHP после установки некоторых индексов вручную.

1. <?

2. $languages = array(

3. 1 => 'Assembler',

4. 'C++',

5. 'Pascal',

6. 'scripting' => 'bash'

7.);

8. $languages['php'] = 'PHP';

9. $languages[100] = 'Java';

10. $languages[] = 'Perl';

11.

12. echo "<pre>";

13. print_r($languages);

14. echo "</pre>";

15.?>

Вывод:

Array([1] => Assembler [2] => C++ [3] => Pascal [scripting] => bash [php] => PHP [100] => Java [101] => Perl)

Цикл foreach

Массив, подобный предыдущему, перебрать с помощью for затруднительно. Для перебора элементов массива предусмотрен специальный цикл foreach:

1. <?

2. $languages = array(

3. 1 => 'Assembler',

4. 'C++',

5. 'Pascal',

6. 'scripting' => 'bash'

7.);

8. $languages['php'] = 'PHP';

9. $languages[100] = 'Java';

10. $languages[] = 'Perl';

11.?>

12. <table>

13. <tr>

14. <th>Индекс</th>

15. <th>Значение</th>

16. </tr>

17. <?

18. foreach ($languages as $key => $value) {

19. echo '<tr><td>'. $key. '</td><td>'. $value. '</td></tr>';

20. }

21.?>

22. </table>

Этот цикл работает следующим образом: в порядке появления в коде программы элементов массива $languages, переменным $key и $value присваюваются соответственно индекс и значение очередного элемента, и выполняется тело цикла.

Если индексы нас не интересуют, цикл можно записать следующим образом: foreach ($languages as $value).

Конструкции list и each

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

Допустим, у нас есть массив $lang = array('php', 'perl', 'basic'). Тогда конструкция list($a, $b) = $lang присвоит переменной $a значение 'php', а $b - 'perl'. Соответственно, list($a, $b, $c) = $lang дополнительно присвоит $c = 'basic'.

Если бы в массиве $lang был только один элемент, PHP бы выдал замечание об отсутствии второго элемента массива.

А если нас интересуют не только значения, но и индексы? Воспользуемся конструкцией each, которая возвращает пары индекс-значение.

1. <?

2. $browsers = array(

3. 'MSIE' => 'Microsoft Internet Explorer 6.0',

4. 'Gecko' => 'Mozilla Firefox 0.9',

5. 'Opera' => 'Opera 7.50'

6.);

7.

8. list($a, $b) = each($browsers);

9. list($c, $d) = each($browsers);

10. list($e, $f) = each($browsers);

11. echo $a.':'.$b."<br>\n";

12. echo $c.':'.$d."<br>\n";

13. echo $e.':'.$f."<br>\n";

14.?>

На первый взгляд может удивить тот факт, что в строках 8-10 переменным присваиваются разные значения, хотя выражения справа от знака присваивания совершенно одинаковые. Дело в том, что у каждого массива есть скрытый указатель текущего элемента. Изначально он указывает на первый элемент. Конструкция each же продвигает указатель на один элемент вперед.

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

1. <?

2. $browsers = array(

3. 'MSIE' => 'Microsoft Internet Explorer 6.0',

4. 'Gecko' => 'Mozilla Firefox 0.9',

5. 'Opera' => 'Opera 7.50'

6.);

7.

8. while (list($key,$value)=each($browsers)) {

9. echo $key. ':'. $value. "<br>\n";

10. }

11.

12.?>

После завершения цикла, указатель текущего элемента указывает на конец массива. Если цикл необходимо выполнить несколько раз, указатель надо принудительно сбросить с помощью оператора reset: reset($browsers). Этот оператор устанавливает указатель текущего элемента в начало массива.

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

Константы

В отличие от переменных, значение константы устанавливается единожды и не подлежит изменению. Константы не начинаются с символа $ и определяются с помощью оператора define:

1. <?

2. define ('MY_NAME', 'Вася');

3.

4. echo 'Меня зовут '. MY_NAME;

5.?>

Константы необязательно называть прописными буквами, но это общепринятое (и удобное) соглашение.

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

Самоучитель PHP: Глава 4. Формы

Содержание главы

Версия для печати

I. HTML-формы. Массивы $_GET и $_POST

II. htmlspecialchars()

III. phpinfo()

HTML-формы. Массивы $_GET и $_POST

Если вы еще не забыли материал первой главы, то вряд ли стоит напоминать: формы являются основным способом обмена данными между веб-сервером и браузером, то есть обеспечивают взаимодействие с пользователем - собственно, для чего и нужно веб-программирование.

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

Итак, возьмем уже знакомый вам по первой главе пример:

1. <html>

2. <body>

3. <?

4. if ($_SERVER['REQUEST_METHOD'] == 'POST') {

5. echo '<h1>Привет, <b>'. $_POST['name']. '</b></h1>!';

6. }

7.?>

8. <form method="POST" action="<?=$_SERVER['PHP_SELF']?>">

9. Введите Ваше имя: <input type="text" name="name">

10. <br>

11. <input type="submit" name="okbutton" value="OK">

12. </form>

13. </body>

14. </html>

Форма, приведенная в строках 8-12, содержит два элемента: name и okbutton. Атрибут method указывает метод отправки формы POST (см. главу 1), атрибут же action, указывающий URL, на который отправляется форма, заполняется значением серверной переменной PHP_SELF - адресом выполняемого в данный момент скрипта.

<?=$_SERVER['PHP_SELF']?> - сокращенная форма записи для echo: <? echo $_SERVER['PHP_SELF'];?>.

Предположим, в поле name мы ввели значение Вася, и нажали кнопку OK. При этом браузер отправляет на сервер POST-запрос. Тело запроса: name=Вася&okbutton=OK. PHP автоматически заполняет массив $_POST:
$_POST['name'] = 'Вася'
$_POST['okbutton'] = 'OK'

В действительности, значение "Вася" отправляется браузером в urlencode-виде; для кодировки windows-1251 это значение выглядит как %C2%E0%F1%FF. Но, поскольку PHP автоматически осуществляет необходимое декодирование, мы можем "забыть" об этой особенности - пока не придется работать с HTTP-запросами вручную.

Так как в теле запроса указываются только имена и значения, но не типы элементов форм, PHP понятия не имеет, соответствует $_POST['name'] строке ввода, кнопке, или списку. Но эта информация нам, в общем-то, совершенно не нужна.:)

Поскольку знать, что написано на кнопке submit, нам необязательно, в строке 11 можно удалить атрибут name, сократив описание кнопки до <input type="submit" value="OK">. В этом случае, браузер отправит POST-запрос name=Вася.

А теперь - то же самое, но для GET-формы:

1. <html>

2. <body>

3. <?

4. if (isset($_GET['name'])) {

5. echo '<h1>Привет, <b>'. $_GET['name']. '</b></h1>!';

6. }

7.?>

8. <form action="<?=$_SERVER['PHP_SELF']?>">

9. Введите Ваше имя: <input type="text" name="name">

10. <br>

11. <input type="submit" value="OK">

12. </form>

13. </body>

14. </html>

В строке 8 можно было бы с таким же успехом написать <form method="GET">: GET - метод по умолчанию. В этот раз браузер отправляет GET-запрос, который равносилен вводу в адресной строке адреса: http:// адрес-сайта / имя-скрипта. php?name=Вася.

PHP с GET-формами поступает точно так же, как и с POST, с тем отличием, что заполняется (угадайте с трех раз:)) массив $_GET.

Кардинальное же отличие - в строке 4. Поскольку простой ввод адреса в строке браузера является GET-запросом, проверка if ($_SERVER['REQUEST_METHOD'] == 'GET') бессмысленна: все, что мы в этом случае выясним - что кто-то от нефиг делать не отправил на наш скрипт POST-форму.;) Поэтому мы прибегаем к к

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...