Дистрибутив Денвер
Мы достаточно подробно рассмотрели установку и настройку PHP для платформ Linux и Windows. Для тех, кто не желает вникать в устройство PHP и требуемых для его работы компонентов, существуют готовые дистрибутивы, содержащие все наиболее распространенные расширения PHP. Один из самых известных – дистрибутив Денвер (http://dklab.ru/chicken/web/). Инструкции по его установке можно прочитать на сайте разработчиков. Отметим только, что его установка достаточно проста и не требует особых навыков. Этот дистрибутив можно рекомендовать для начинающих программистов, желающих научиться работать с PHP. Для более серьезных задач лучше все же установить и настроить PHP самостоятельно.
История PHP
Язык PHP был разработан как инструмент для решения чисто практических задач. Его создатель, Расмус Лердорф, хотел знать, сколько человек читают его online-резюме, и написал для этого простенькую CGI-оболочку на языке Perl, т.е. это был набор Perl-скриптов, предназначенных исключительно для определенной цели – сбора статистики посещений.
Для справки. CGI (Common Gateway Interface – общий интерфейс шлюзов) является стандартом, который предназначен для создания серверных приложений, работающих по протоколу HTTP. Такие приложения (их называют шлюзами или CGI-программами) запускаются сервером в режиме реального времени. Сервер передает запросы пользователя CGI-программе, которая их обрабатывает и возвращает результат своей работы на экран пользователя. Таким образом, посетитель получает динамическую информацию, которая может изменяться в результате влияния различных факторов. Сам шлюз (скрипт CGI) может быть написан на различных языках программирования – Cи/C++, Fortran, Perl, TCL, UNIX Shell, Visual Basic, Python и др.
Вскоре выяснилось, что оболочка обладает небольшой производительностью, и пришлось переписать ее заново, но уже на языке Си. После этого исходники были выложены на всеобщее обозрение для исправления ошибок и дополнения. Пользователи сервера, где располагался сайт с первой версией PHP, заинтересовались инструментом, появились желающие его использовать. Так что скоро PHP превратился в самостоятельный проект, и в начале 1995 года вышла первая известная версия продукта, называвшаяся Personal Home Page Tools (средства для персональной домашней страницы). Средства эти были более чем скромными: анализатор кода, понимающий всего лишь несколько специальных команд, и набор утилит, полезных для создания гостевой книги, счетчика посещений, чата и т.п.
К середине 1995 года после основательной переработки появилась вторая версия продукта, названная PHP/FI (Personal Home Page / Forms Interpreter – персональная домашняя страница/ интерпретатор форм). Она включала набор базовых возможностей сегодняшнего PHP, возможность автоматически обрабатывать html-формы и встраиваться в html-коды. Синтаксис PHP/FI сильно напоминал синтаксис Perl, но был более простым.
В 1997 вышла вторая версия Cи-реализации PHP – PHP/FI 2.0. К тому моменту PHP использовали уже несколько тысяч людей по всему миру, примерно с 50 тыс. доменов, что составляло около 1% всего числа доменов Internet. Число разработчиков PHP увеличилось до нескольких человек, но, несмотря на это, PHP/FI 2.0 все еще оставался крупным проектом одного человека. Официально PHP/FI 2.0 вышел только в ноябре 1997 года, просуществовав до этого в основном в бета-версиях. Вскоре после выхода его заменили альфа-версии PHP 3.0.
PHP 3.0 была первой версией, напоминающей PHP, каким мы знаем его сегодня. Он очень сильно отличался от PHP/FI 2.0 и появился опять же как инструмент для решения конкретной прикладной задачи. Его создатели, Энди Гутманс (Andi Gutmans) и Зив Сураски (Zeev Suraski), в 1997 году переписали заново код PHP/FI, поскольку он показался им непригодным для разработки приложения электронной коммерции, над которым они работали. Для того чтобы получить помощь в реализации проекта от разработчиков PHP/FI, Гутманс и Сураски решили объединиться с ними и объявить PHP3 официальным преемником PHP/FI. После объединения разработка PHP/FI была полностью прекращена.
Одной из сильных сторон PHP 3.0 была возможность расширения ядра. Именно свойство расширяемости PHP 3.0 привлекло внимание множества разработчиков, желающих добавить свой модуль расширения. Кроме того, PHP 3.0 предоставляла широкие возможности для взаимодействия с базами данных, различными протоколами и API. Немаловажным шагом к успеху оказалась разработка нового, намного более мощного и полного синтаксиса с поддержкой ООП. С момента появления PHP 3.0 изменилась не только функциональность и внутреннее устройство языка, но и его название. В аббревиатуре PHP больше не было упоминания о персональном использовании, PHP стало сокращением (рекурсивным акронимом) от PHP: Hypertext Preprocessor, что значит «PHP: препроцессор гипертекста».
К концу 1998 года число пользователей PHP возросло до десятков тысяч. Сотни тысяч web-сайтов сообщали о том, что они работают с использованием этого языка. Почти на 10% серверов Internet был установлен PHP 3.0.
Официально PHP 3.0 вышел в июне 1998 года, после 9 месяцев публичного тестирования. А уже к зиме Энди Гутманс и Зив Сураски начали переработку ядра PHP. В их задачи входило увеличение производительности работы сложных приложений и улучшение модульности кода, лежащего в основе PHP.
Новое ядро было названо «Zend Engine» (от имен создателей: Zeev и Andi) и впервые представлено в середине 1999 года. PHP 4.0, основанный на этом ядре и принесший с собой набор дополнительных функций, официально вышел в мае 2000 года, почти через два года после своего предшественника, PHP 3.0. Помимо улучшения производительности, PHP 4.0 имел еще несколько ключевых нововведений, таких как поддержка сессий, буферизация вывода, более безопасные способы обработки вводимой пользователем информации и несколько новых языковых конструкций.
В настоящее время ведутся работы по улучшению Zend Engine и внедрению нововведений в PHP 5.0, первые бета-версии которого уже вышли в свет. Одно из существенных изменений произошло в объектной модели языка, ее основательно подлатали и добавили много новых возможностей.
Сегодня PHP используется сотнями тысяч разработчиков. Несколько миллионов сайтов написаны на PHP, что составляет более 20% доменов Internet.
Первая PHP-программа
По большому счету, первую PHP-программу вы уже создали, когда проверяли, работает ли интерпретатор PHP (в предыдущей главе). Сейчас мы хотим более подробно рассказать о том, что представляет собой PHP-программа и чем она отличается от программ на языках Cи, Perl и JavaScript. Рассмотрим пример.
<html> <head> <title>Пример</title> </head> <body> <?php echo "<p>Привет, я – скрипт PHP!</p>"; ?> </body> </html>
Пример 1.1. Простой html-файл со встроенным кодом на РНР (html, txt)
Это простой HTML-файл, в который встроен с помощью специальных тегов код, написанный на языке PHP.
Как мы уже отмечали выше, PHP похож на Cи и Perl. Однако приведенная здесь программа сильно отличается от аналогичных по смыслу программ на языках Cи и Perl. Здесь не нужно писать кучу специальных команд для вывода HTML. Пишется непосредственно HTML-скрипт, в который можно встраивать PHP-код, осуществляющий какие-либо действия (например, выводящий текст на экран, как в нашем примере). Недостатком PHP по сравнению с Cи и Perl, несмотря на все усилия разработчиков, все еще является недостаточная быстрота выполнения сложных скриптов.
PHP-скрипты – это программы, которые выполняются и обрабатываются сервером. Так что сравнивать его со скриптовыми языками типа JavaScript невозможно, потому что написанные на них скрипты выполняются на машине клиента. В чем отличие скриптов, выполняемых на сервере и на клиенте? Если скрипт обрабатывается сервером, клиенту посылаются только результаты работы скрипта. Например, если на сервере выполнялся скрипт, подобный приведенному выше, клиент получит сгенерированную HTML-страницу вида:
<html> <head> <title>Пример</title> </head> <body> <p>Привет, я – скрипт PHP!</p> </body> </html>
В этом случае клиент не знает, какой код выполняется. Можно даже сконфигурировать свой сервер таким образом, чтобы HTML-файлы обрабатывались процессором PHP, так что клиенты даже не смогут узнать, получают ли они обычный HTML-файл или результат выполнения скрипта. Если же скрипт обрабатывается клиентом (например, это программа на языке JavaScript), то клиент получает страницу, содержащую код скрипта.
Мы отмечали выше, что PHP-скрипты встраиваются в HTML-код. Возникает вопрос, каким образом? Есть несколько способов. Один из них приведен в самом первом примере – с помощью открывающего тега <?php и закрывающего тега ?>. Такого вида специальные теги позволяют переключаться между режимами HTML и PHP. Этот синтаксис наиболее предпочтителен, поскольку позволяет задействовать PHP в XML-совместимых программах (например, написанных на языке XHTML), но тем не менее можно использовать следующие альтернативные варианты (команда echo "Some text"; выводит на экран текст «Some text».):
<? echo " Это простейшая инструкция для обработки PHP"; ?> <script language="php"> echo "Некоторые редакторы (FrontPage) предпочитают делать так"; </script>
<% echo "Можно использовать теги в стиле ASP "; %>
Первый из этих способов не всегда доступен. Чтобы им пользоваться, нужно включить короткие теги либо с помощью функции short_tags() для PHP 3, либо включив установку short_open_tag в конфигурационном файле PHP, либо скомпилировав PHP с параметром --enable-short-tags. Даже если это включено по умолчанию в php.ini-dist, использование коротких тегов не рекомендуется. Второй способ аналогичен вставке, например, JavaScript-кода и использует для этого соответствующий html тег. Поэтому использовать его можно всегда, но это делается редко из-за его громоздкости. Третий способ можно применить, только если теги в стиле ASP были включены, используя конфигурационную установку asp_tags.
Когда PHP обрабатывает файл, он просто передает его текст, пока не встретит один из перечисленных специальных тегов, который сообщает ему о необходимости начать интерпретацию текста как кода PHP. Затем он выполняет весь найденный код до закрывающего тега, говорящего интерпретатору, что далее снова идет просто текст. Этот механизм позволяет внедрять PHP-код в HTML – все за пределами тегов PHP остается неизменным, тогда как внутри интерпретируется как код. Заметим также, что php-файл не похож на CGI-скрипт. Php файл не должен быть исполнимым или еще каким-либо образом помеченным.
Для того чтобы отправить php-файл на обработку серверу, нужно в строке браузера набрать путь к этому файлу на сервере. Скрипты php должны располагаться там, где разрешен доступ через www, например там же, где лежит домашняя страничка. Если php-файл лежит на локальной машине, то его можно обработать с помощью интерпретатора командной строки.
devel The following NEW packages
[root@greydragon apt]# apt-get build-dep mod_php Reading Package Lists... Done Collecting File Provides... Done Building Dependency Tree... Done Note, selecting libgdbm-devel instead of gdbm- devel The following NEW packages will be installed: apache-devel bison byacc flex libexpat-devel libgdbm-devel libltdl libmm-devel libpam-devel libtool 0 packages upgraded, 10 newly installed, 0 removed and 73 not upgraded. Need to get 937kB of archives. After unpacking 2357kB of additional disk space will be used. Do you want to continue? [Y/n] Get:1 ftp://ftp.altlinux.ru ALTLinux/main byacc 1.9-ipl9mdk [31.8kB] ..... Get:10 ftp://ftp.altlinux.ru ALTLinux/main libtool 2:1.4.2-alt0.2 [302kB] Fetched 937kB in 9m19s (1675B/s) Executing RPM (/bin/rpm -Uvh --fancypercent --oldpackage)... Preparing... ################################################### [100%] .... [root@greydragon apt]# apt-get install mod_php Reading Package Lists... Done Collecting File Provides... Done Building Dependency Tree... Done The following NEW packages will be installed: mod_php 0 packages upgraded, 1 newly installed, 0 removed and 73 not upgraded. Need to get 46.6kB of archives. After unpacking 69.2kB of additional disk space will be used. Get:1 ftp://ftp.altlinux.ru ALTLinux/main mod_php 1:4.3.0-alt0.cvs20030207 [46.6kB] Fetched 46.6kB in 24s (1918B/s) Executing RPM (/bin/rpm -Uvh --fancypercent --oldpackage)... Preparing... ################################################### [100%] 1: mod_php ################################################### [100%] Shutting down httpd: [ OK ] Checking configuration sanity for httpd: [ OK ] Starting httpd: [ OK ] |
Листинг 1.0. Результат работы менеджера пакетов Synaptic |
Закрыть окно |
<html> <head> <title>Пример</title> </head> <body> <?php echo "<p>Привет, я – скрипт PHP!</p>"; ?> </body> </html> |
Пример 1.1. Простой html- файл со встроенным кодом на РНР |
Закрыть окно |
Установка Apache 1.3.29 под Windows XP
Чтобы что-нибудь установить, нужно для начала иметь соответствующее программное обеспечение (ПО). Скачать ПО для установки Apache можно, например, с его официального сайта http://www.apache.org. Мы скачали файл apache_1.3.29-win3x86-no_src.exe. Это автоматический установщик (иначе – wizard) сервера Apache под Windows. Эта программа попытается почти самостоятельно (а точнее, с минимальными усилиями с вашей стороны) установить на компьютер какое-либо программное обеспечение, а в данном случае сервер. После запуска файла установщика появляется следующее окошко (рис. 1.1).
Рис. 1.1. Автоматическая установка сервера Apache
Чтобы установить HTTP-сервер Apache версии 1.3.29 на свой компьютер, нужно нажать на кнопку Next. Кстати говоря, эта же программа позволит изменить или удалить уже установленный web-сервер.
После нажатия кнопки Next программа предложит согласиться с условиями лицензии (рис. 1.2).
Рис. 1.2. Лицензионное соглашение
Следующий экран будет содержать информацию о сервере Apache, и в частности о его Windows-реализации (его изображение не приводим).
На следующем шаге нужно ввести имя сетевого домена, имя сервера и e-mail администратора. Программа попытается автоматически определить ваш домен и хост по настройкам компьютера (рис. 1.3).
Рис. 1.3. Основная информация о сервере
После того как вы ввели данные в вышеприведенную форму, нужно выбрать тип установки: полная (устанавливаются все компоненты сервера) или определяемая пользователем (можно выбрать компоненты для установки) (рис. 1.4.).
Рис. 1.4. Тип установки
Выбор компонентов сервера не очень большой – это инструменты, необходимые для работы сервера и документация к нему (рис. 1.5).
Рис. 1.5. Выбор компонент пользовательской установки
Мы выберем полную установку. Тогда на следующем шаге программа предложит выбрать папку, в которую будет установлен сервер. По умолчанию сервер устанавливается в папку c:\Program Files\Apache Group\ (рис. 1.6).
Рис. 1.6. Папка, в которую будет установлен сервер
На следующем экране (рис. 1.7) потребуется подтвердить правильность введенных данных и начать установку. Из любого окна установки, включая и это, можно вернуться назад и изменить введенные ранее данные.
Рис. 1.7. Начало установки
После нажатия кнопки Install начнется непосредственная установка сервера. От пользователя никаких дополнительных действий больше не требуется. С одной стороны, это хорошо, но есть у такой автоматизированной установки и некоторые недостатки. Например, домашние директории пользователей оказываются там же, где и файлы настроек сервера (c:\Program Files\Apache Group\Apache\users\). Это небезопасно, если на компьютере работает несколько пользователей, не являющихся администраторами сервера. Но для начала можно ничего не менять. Допустим, мы запустили установщик, ввели все необходимые данные, он выполнил все операции успешно и говорит, что сервер установлен. Как проверить, действительно ли сервер установлен? Набираем в окне браузера http://localhost/. Если все установилось правильно, мы получим страничку приветствия сервера Apache (см. рис. 1.8).
Рис. 1.8. Страница приветствия
Итак, сервер установлен. Как теперь с ним работать? Откуда можно запускать скрипты и где должны находиться файлы пользователей? Файлы, которые должны быть обработаны сервером, можно сохранять либо в корне сервера (в нашем случае это c:\Program Files\Apache Group\Apache\htdocs ), либо в директориях пользователей (в нашем случае это c:\Program Files\Apache Group\Apache\users\). Местоположение корня сервера и директорий пользователей прописано в настройках сервера, а точнее, в файле конфигурации httpd.conf (найти его можно в c:\Program Files\Apache Group\Apache\conf ). Для изменения этих путей нужно изменить соответствующие переменные в файле конфигурации сервера. Переменная в файле конфигурации ServerRoot отвечает за корневую директорию сервера, а переменная UserDir – за директорию, где будут располагаться файлы пользователей сервера (для более безопасной работы советуем изменить переменную UserDir на что-нибудь типа c:\users\). Чтобы получить доступ к файлу test.html, находящемуся в корне сервера, нужно набрать в браузере http://localhost/test.html (т. е. имя хоста, имя файла). Если же файл test.html находится в директории пользователя user, то для его просмотра нужно набрать в браузере http://localhost/~user/test.html.
Установка и настройка ПО
Возможности языка мы обсудили, области применения рассмотрели, историю изучили. Теперь можно приступать к установке необходимого инструментария. Поскольку в качестве практической основы курса мы будем рассматривать задачи, решаемые с помощью технологии клиент-сервер, и PHP соответственно будет использоваться для создания скриптов, обрабатываемых сервером, нам нужно установить web-сервер и интерпретатор PHP. В качестве web-сервера выберем, например, Apache, как наиболее популярный среди web-разработчиков. Для просмотра результатов работы программ нам понадобится web-браузер, например Internet Explorer.
Установка PHP 4.3.4 под Windows
Перейдем к установке PHP. Скачать его дистрибутив можно с официального сайта PHP – http://www.php.net. Для удобства лучше выбрать автоматический инсталлятор, как и в случае с сервером. Самое первое окошко при такой установке PHP содержит приветствие и предупреждение о существовании авторских прав на этот продукт (рис. 1.9).
Рис. 1.9. Программа автоматической установки PHP
Далее нужно прочитать и согласиться (или не согласиться) с лицензией (рис. 1.10).
Рис. 1.10. Лицензионное соглашение
Затем выбираем тип установки: стандартный или для специалистов. Мы выберем стандартную установку (рис. 1.11).
Рис. 1.11. Тип установки
В следующем окне программа предложит выбрать директорию для установки PHP. Туда будут скопированы файлы библиотек, расширений, интерпретатор командной строки, модули и т.п. (рис. 1.12).
Рис. 1.12. Выбор папки, в которую будет установлен PHP
В следующем окошке предлагается ввести адрес SMTP-сервера, т.е. сервера отправки почтовых сообщений, и обратный адрес отправителя почты. Это окошко мы приводить не будем.
Далее предлагается выбрать из списка сервер, с которым будет работать PHP. Поскольку мы установили Apache, то выберем из списка именно его (рис. 1.13).
Рис. 1.13. Выбор сервера, на котором будет работать PHP
Следующее окошко начинает инсталляцию (рис. 1.14).
Рис. 1.14. Начало автоматической установки PHP
После копирования необходимых файлов мы получили следующее сообщение (см. рис. 1.15):
Рис. 1.15. Сообщение о невозможности автоматически настроить Apache для работы с PHP
Это значит, что нужно настраивать сервер Apache для работы с PHP вручную.
Сначала следует выбрать, как мы хотим установить PHP, поскольку он поставляется в двух видах: CGI-скрипт (php.exe) или набор SAPI-модулей (например, php4isapi.dll), используемых сервером. Последний вариант обладает новыми возможностями, однако из-за недостаточной проработанности может функционировать недостаточно надежно, особенно на платформах старше Windows 2000 (может появляться куча ошибок 500, могут возникать сбои в других серверных модулях, таких как ASP). Так что, если нужна абсолютная стабильность – надо выбирать установку PHP в виде CGI выполнимого приложения.
Если мы хотим установить PHP как серверный модуль, то в файле конфигурации сервера (httpd.conf) нужно написать:
LoadModule php4_module c:/php/sapi/php4apache.dll AddType application/x-httpd-php .php .phtml AddModule mod_php4.c
Если мы устанавливаем PHP как cgi-программу, то в httpd.conf нужно написать:
ScriptAlias /php/ "c:/php/" AddType application/x-httpd-php .php .phtml Action application/x-httpd-php "/php/php.exe"
В этом случае могут возникнуть проблемы с безопасностью. Рекомендуется исправить директорию, где лежит исполняемый файл интерпретатора (c:\php\), на что-нибудь менее очевидное (например, на c:\abc_php\). Мы советуем устанавливать PHP как серверный модуль.
Еще нужно отредактировать файл php.ini (в папке c:\Windows), чтобы PHP «знал», где находится корневая директория сервера, где пользовательские директории, а где его собственные библиотеки расширений. За это в файле php.ini отвечают соответственно переменные doc_root, user_dir и extension_dir. Зададим их таким образом:
doc_root = "c:\Program Files\Apache Group\Apache\htdocs" user_dir = "c:\users" extension_dir = "c:\php\extensions"
Кроме того, можно выбрать расширения, которые будут загружаться при запуске PHP. В реализацию PHP под Windows изначально входит очень мало расширений. Чтобы загрузить расширение, нужно раскомментировать в php.ini соответствующую ему строчку 'extension=php_*.dll'. Например, чтобы загрузить расширение для работы с MSSQL, нужно раскомментировать строку 'extension=php_mssql.dll'. Некоторые расширения требуют дополнительных библиотек. Поэтому рекомендуется скопировать дополнительные библиотеки в системную директорию (из папки c:\php\dlls). При первой установке следует настроить и протестировать PHP без расширений.
Для того чтобы настройки, выполненные в конфигурационных файлах сервера и PHP вступили в силу, нужно перезапустить сервер.
Проверим, работает ли PHP. Для этого создадим тестовый файл (1.php) в директории пользователя (c:\users\nina) со следующим содержанием:
<?php echo"<h1>Привет всем!</h1>"; ?>
Запустим этот файл через браузер, набрав http://localhost/~nina/1.php. Если что-то не так, то на экран будет выведен текст этого файла. Если все хорошо, то наш скрипт должен обработаться сервером и вывести большими буквами строку «Привет всем!».
Установка PHP под Linux
Как и в случае с Windows, для Linux существует два способа установки PHP: используя пакеты и непосредственно компилируя исходный код PHP, который можно скачать с http://www.php.net. Мы остановимся на первом варианте и рассмотрим установку PHP+Apache на примере дистрибутива AltMaster2.2 (http://altlinux.ru).
Для того чтобы установить apache, необходимо выбрать одноименный пакет. Это можно сделать, например, с помощью менеджера пакетов Synaptic. Воспользовавшись меню «Пакет -> Установить» (рис. 1.16) нужно выбрать интересующие пакеты. После этого необходимо перейти к установке выбранных пакетов с помощью меню «Действия -> Выполнить». После установки Apache имеет смысл перезагрузиться или выполнить следующую команду:
/etc/init.d/httpd start # /etc/init.d/httpd start Starting httpd: [ OK ]
Это приведет к запуску сервера и можно будет увидеть по адресу http://localhost почти такую же страницу, как и при установке Apache под Windows. Возможным отличием будет присутствие логотипа AltLinux.
Рис. 1.16. Выбор пакета для установки Apache под Linux
После установки Apache можно приступить к установке непосредственно PHP. Опять же можно использовать PHP с помощью CGI и через модуль Apache. В первом случае достаточно пакета php и необходимых для его установки пакетов. Во втором случае необходимо дополнительно установить пакет mod_php. (рис. 1.17).
Рис. 1.17. Выбор пакетов для установки PHP под Linux
Менеджер пакетов Synaptic – это оболочка к программе apt-get, более подробно о ней можно узнать с помощью команды man apt-get. Воспользуемся утилитой apt-get для установки пакета mod_php. Команда apt-get build-dep mod_php установит пакеты, которые нам необходимы для инсталляции mod_php. Команда apt-get install mod_php завершит установку:
Листинг 1.0. Результат работы менеджера пакетов Synaptic (html, txt)
Как видно из приведенного листинга, скрипт установки самостоятельно перезагрузил сервер Apache. Также он самостоятельно внес изменения в конфигурационный файл Apache, полный путь до которого: /etc/httpd/conf/httpd.conf
В httpd.conf добавлена строка:
Include conf/addon-modules/mod_php4.conf
Содержимое файла mod_php4.conf
LoadModule php4_module usr/lib/apache/libphp4.so AddModule mod_php4.c AddType application/x-httpd-php .php .php4 .php3 .phtml AddType application/x-httpd-php-source .phps AddHandler application/x-httpd-php .php .php4 .php3 .phtml
Как видно, изменения в httpd. conf подобны изменениям, которые мы вносили при установке под Windows.
Теперь можно воспользоваться тестовым файлом для проверки работоспособности PHP+Apache. Создадим test.php со следующим содержанием:
<?php echo"<h1>Привет всем!</h1>"; ?>
Корень сервера находится /var/www/html/. Можно создать каталог test и разместить там файл test.php. Вызвав этот файл из браузера по его адресу (http://localhost/test/test.php), получим страничку с текстом «Привет всем».
В заключение отметим, что процесс установки PHP с помощью пакетов в других дистрибутивах Linux принципиально не отличается от рассмотренного нами. Процесс установки из исходного кода в них же подробно описан. Стоит отметить, что «ручная» компоновка позволит настроить PHP под конкретные нужды, также возможен выигрыш в производительности.
Возможности PHP
«PHP может все», – заявляют его создатели. В первую очередь PHP используется для создания скриптов, работающих на стороне сервера, для этого его, собственно, и придумали. PHP способен решать те же задачи, что и любые другие CGI-скрипты, в том числе обрабатывать данные html-форм, динамически генерировать html страницы и т.п. Но есть и другие области, где может использоваться PHP. Всего выделяют три основные области применения PHP.
Первая область, как уже говорилось, – это создание приложений (скриптов), которые исполняются на стороне сервера. PHP наиболее широко используется именно для создания такого рода скриптов. Для того чтобы работать таким образом, понадобится PHP-парсер (т.е. обработчик php-скриптов) и web-сервер для обработки скрипта, браузер для просмотра результатов работы скрипта, ну, и, конечно, какой-либо текстовый редактор для написания самого php-кода. Парсер PHP распространяется в виде CGI-программы или серверного модуля. Как установить его и web-сервер на свой компьютер, мы рассмотрим немного позднее. В этом курсе мы будем обсуждать, как правило, создание именно серверных приложений, как пример использования языка PHP. Вторая область – это создание скриптов, выполняющихся в командной строке. То есть с помощью PHP можно создавать такие скрипты, которые будут исполняться, вне зависимости от web-сервера и браузера, на конкретной машине. Для такой работы потребуется лишь парсер PHP (в этом случае его называют интерпретатором командной строки (cli, command line interpreter)). Этот способ работы подходит, например, для скриптов, которые должны выполняться регулярно с помощью различных планировщиков задач или для решения задач простой обработки текста. И последняя область – это создание GUI-приложений (графических интерфейсов), выполняющихся на стороне клиента. В принципе это не самый лучший способ использовать PHP, особенно для начинающих, но если вы уже досконально изучили PHP, то такие возможности языка могут оказаться весьма полезны. Для применения PHP в этой области потребуется специальный инструмент – PHP-GTK, который является расширением PHP.
Итак, область применения PHP достаточно обширна и разнообразна. Тем не менее существует множество других языков программирования, способных решать похожие задачи. Почему стоит изучать PHP? Что это нам дает? Во-первых, PHP очень прост в изучении. Достаточно ознакомиться лишь с основными правилами синтаксиса и принципами его работы, и можно начинать писать собственные программы, причем браться за такие задачи, решение которых на другом языке требовало бы серьезной подготовки.
Во-вторых, PHP поддерживается почти на всех известных платформах, почти во всех операционных системах и на самых разных серверах. Это тоже очень важно. Вряд ли кому-то захочется переходить, например, от работы под Windows к работе под Linux или от сервера IIS к серверу Apache только для того, чтобы изучить еще один язык программирования.
В PHP сочетаются две самые популярные парадигмы программирования – объектная и процедурная. В PHP4 более полно поддерживается процедурное программирование, но есть возможность писать программы и в объектном стиле. Уже в первых пробных версиях PHP5 большинство недочетов в реализации объектно-ориентированной модели языка, существующих в PHP4, устранены. Таким образом, можно выбрать наиболее привычный стиль работы.
Если говорить о возможностях сегодняшнего PHP, то они выходят далеко за рамки тех, что были реализованы в его первых версиях. С помощью PHP можно создавать изображения, PDF-файлы, флэш-ролики, в него включена поддержка большого числа современных баз данных, встроены функции для работы с текстовыми данными любых форматов, включая XML, и функции для работы с файловой системой. PHP поддерживает взаимодействие с различными сервисами посредством соответствующих протоколов, таких как протокол управления доступом к директориям LDAP, протокол работы с сетевым оборудованием SNMP, протоколы передачи сообщений IMAP, NNTP и POP3, протокол передачи гипертекста HTTP и т.д.
Обращая внимание на взаимодействие между различными языками, следует упомянуть о поддержке объектов Java и возможности их использования в качестве объектов PHP. Для доступа к удаленным объектам можно использовать расширение CORBA.
Для работы с текстовой информацией PHP унаследовал (с небольшими изменениями) механизмы работы с регулярными выражениями из языка Perl и UNIX-систем. Для обработки XML-документов можно использовать как стандарты DOM и SAX, так и API для XSLT-трансформаций.
Для создания приложений электронной коммерции существует ряд полезных функций, таких как функции осуществления платежей Cybercash, CyberMUT, VeriSign Payflow Pro и CCVS.
о том, что такое язык
Итак, мы получили представление о том, что такое язык PHP, как он появился и развивался, узнали, как и где его можно использовать, установили программное обеспечение и сделали все необходимые настройки для работы с ним, а также выяснили, что представляет собой php-программа. В следующих лекциях мы рассмотрим основы синтаксиса PHP и решим несколько полезных практических задач.
Двойные кавычки
Если строка заключена в двойные кавычки «"», PHP распознает большее количество управляющих последовательностей для специальных символов. Некоторые из них приведены в таблице 2.7.
\n | Новая строка (LF или 0x0A (10) в ASCII) |
\r | Возврат каретки (CR или 0x0D (13) в ASCII) |
\t | Горизонтальная табуляция (HT или 0x09 (9) в ASCII) |
\\ | Обратная косая черта |
\$ | Знак доллара |
\" | Двойная кавычка |
Повторяем, если вы захотите экранировать любой другой символ, обратная косая черта также будет напечатана!
Самым важным свойством строк в двойных кавычках является обработка переменных.
Heredoc
Другой способ определения строк – это использование heredoc-синтаксиса. В этом случае строка должна начинаться с символа <<<, после которого идет идентификатор. Заканчивается строка этим же идентификатором. Закрывающий идентификатор должен начинаться в первом столбце строки. Кроме того, идентификатор должен соответствовать тем же правилам именования, что и все остальные метки в PHP: содержать только буквенно-цифровые символы и знак подчеркивания и начинаться не с цифры или знака подчеркивания.
Heredoc-текст ведет себя так же, как и строка в двойных кавычках, при этом их не имея. Это означает, что вам нет необходимости экранировать кавычки в heredoc, но вы по-прежнему можете использовать перечисленные выше управляющие последовательности. Переменные внутри heredoc тоже обрабатываются.
<?php $str = <<<EOD Пример строки,охватывающей несколько строчек, с использованием heredoc-синтаксиса EOD; // Здесь идентификатор – EOD. Ниже // идентификатор EOT $name = 'Вася'; echo <<<EOT Меня зовут "$name". EOT; // это выведет "Меня зовут "Вася"." ?>
Пример 2.8. Использование heredoc-синтаксиса (html, txt)
Замечание: Поддержка heredoc была добавлена в PHP 4.
Часто при написании программ возникает
Часто при написании программ возникает необходимость делать какие-либо комментарии к коду, которые никак не влияют на сам код, а только поясняют его. Это важно при создании больших программ и в случае, если несколько человек работают над одной программой. При наличии комментариев в программе в ее коде разобраться гораздо проще. Кроме того, если решать задачу по частям, недоделанные части решения также удобно комментировать, чтобы не забыть о них в дальнейшем. Во всех языках программирования предусмотрена возможность включать комментарии в код программы. PHP поддерживает несколько видов комментариев: в стиле Cи, C++ и оболочки Unix. Символы // и # обозначают начало однострочных комментариев, /* и */ – соответственно начало и конец многострочных комментариев.
<?php echo "Меня зовут Вася"; // Это однострочный комментарий // в стиле С++ echo "Фамилия моя Петров"; /* Это многострочный комментарий. Здесь можно написать несколько строк. При исполнении программы все, что находится здесь (закомментировано), будет игнорировано. */ echo "Я изучаю PHP в INTUIT.ru"; # Это комментарий в стиле # оболочки Unix ?>
Пример 2.1. Использование комментариев в PHP (html, txt)
Константы
Для хранения постоянных величин, т.е. таких величин, значение которых не меняется в ходе выполнения скрипта, используются константы. Такими величинами могут быть математические константы, пароли, пути к файлам и т.п. Основное отличие константы от переменной состоит в том, что ей нельзя присвоить значение больше одного раза и ее значение нельзя аннулировать после ее объявления. Кроме того, у константы нет приставки в виде знака доллара и ее нельзя определить простым присваиванием значения. Как же тогда можно определить константу? Для этого существует специальная функция define(). Ее синтаксис таков:
define("Имя_константы", "Значение_константы", [Нечувствительность_к_регистру])
По умолчанию имена констант чувствительны к регистру. Для каждой константы это можно изменить, указав в качестве значения аргумента Нечувствительность_к_регистру значение True. Существует соглашение, по которому имена констант всегда пишутся в верхнем регистре.
Получить значение константы можно, указав ее имя. В отличие от переменных, не нужно предварять имя константы символом $. Кроме того, для получения значения константы можно использовать функцию constant() с именем константы в качестве параметра.
<?php // определяем константу // PASSWORD define("PASSWORD","qwerty"); // определяем регистронезависимую // константу PI со значением 3.14 define("PI","3.14", True); // выведет значение константы PASSWORD, // т.е. qwerty echo (PASSWORD); // тоже выведет qwerty echo constant("PASSWORD"); echo (password); /* выведет password и предупреждение, поскольку мы ввели регистрозависимую константу PASSWORD */ echo pi; // выведет 3.14, поскольку константа PI // регистронезависима по определению ?>
Пример 2.4. Константы в PHP (html, txt)
Кроме переменных, объявляемых пользователем, о которых мы только что рассказали, в PHP существует ряд констант, определяемых самим интерпретатором. Например, константа __FILE__ хранит имя файла программы (и путь к нему), которая выполняется в данный момент, __FUNCTION__ содержит имя функции, __CLASS__ – имя класса, PHP_VERSION – версия интерпретатора PHP. Полный список предопределенных констант можно получить, прочитав руководство по PHP.
Одинарные кавычки
Простейший способ определить строку – это заключить ее в одинарные кавычки «'». Чтобы использовать одинарную кавычку внутри строки, как и во многих других языках, перед ней необходимо поставить символ обратной косой черты «\», т. е. экранировать ее. Если обратная косая черта должна идти перед одинарной кавычкой либо быть в конце строки, необходимо продублировать ее «\\'».
Если внутри строки, заключенной в одинарные кавычки, обратный слэш «\» встречается перед любым другим символом (отличным от «\» и «'» ), то он рассматривается как обычный символ и выводится, как и все остальные. Поэтому обратную косую черту необходимо экранировать, только если она находится в конце строки, перед закрывающей кавычкой.
В PHP существует ряд комбинаций символов, начинающихся с символа обратной косой черты. Их называют управляющими последовательностями, и они имеют специальные значения, о которых мы расскажем немного позднее. Так вот, в отличие от двух других синтаксисов, переменные и управляющие последовательности для специальных символов, встречающиеся в строках, заключенных в одинарные кавычки, не обрабатываются.
<?php echo 'Также вы можете вставлять в строки символ новой строки таким образом, поскольку это нормально';
// Выведет: Чтобы вывести ' надо // перед ней поставить \ echo 'Чтобы вывести \' надо перед ' 'ней поставить \\'; // Выведет: Вы хотите удалить C:\*.*? echo 'Вы хотите удалить C:\\*.*?'; // Выведет: Это не вставит: \n // новую строку echo 'Это не вставит: \n новую строку'; // Выведет: Переменные $expand также // $either не подставляются echo 'Переменные $expand также $either' . 'не подставляются'; ?>
Пример 2.7. Использование управляющих последовательностей (html, txt)
Операторы
Операторы позволяют выполнять различные действия с переменными, константами и выражениями. Мы еще не упоминали о том, что такое выражение. Выражение можно определить как все, что угодно, что имеет значение. Переменные и константы – это основные и наиболее простые формы выражений. Существует множество операций (и соответствующих им операторов), которые можно производить с выражениями. Рассмотрим некоторые из них подробнее.
+ | Сложение | $a + $b |
- | Вычитание | $a - $b |
* | Умножение | $a * $b |
/ | Деление | $a / $b |
% | Остаток от деления | $a % $b |
. | Конкатенация (сложение строк) | $c = $a . $b
(это строка, состоящая из $a и $b) |
= | Присваивание | Переменной слева от оператора будет присвоено значение, полученное в результате выполнения каких-либо операций или переменной/константы с правой стороны | $a = ($b = 4) +5;
($a будет равна 9, $b будет равна 4) | |
+= | Сокращение. Прибавляет к переменной число и затем присваивает ей полученное значение | $a += 5;
(эквивалентно $a = $a + 5;) | ||
.= | Сокращенно обозначает комбинацию операций конкатенации и присваивания (сначала добавляется строка, потом полученная строка записывается в переменную) |
$b = "Привет "; $b .= "всем"; (эквивалентно $b = $b . "всем";) В результате: $b="Привет всем" |
and | И | $a и $b истинны (True) | $a and $b |
&& | И | $a && $b | |
or | Или | Хотя бы одна из переменных $a или $b истинна (возможно, что и обе) | $a or $b |
|| | Или | $a || $b | |
xor | Исключающее или | Одна из переменных истинна. Случай, когда они обе истинны, исключается | $a xor $b |
! | Инверсия (NOT) | Если $a=True, то !$a=False и наоборот | ! $a |
== | Равенство | Значения переменных равны | $a == $b |
=== | Эквивалентность | Равны значения и типы переменных | $a === $b |
!= | Неравенство | Значения переменных не равны | $a != $b |
<> | Неравенство | $a <> $b | |
!== | Неэквивалентность | Переменные не эквивалентны | $a !== $b |
< | Меньше | $a < $b | |
> | Больше | $a > $b | |
<= | Меньше или равно | $a <= $b | |
>= | Больше или равно | $a >= $b |
++$a | Пре-инкремент | Увеличивает $a на единицу и возвращает $a |
<? $a=4; echo "Должно быть 4:" .$a++; echo "Должно быть 6:" .++$a; ?> |
$a++ | Пост-инкремент | Возвращает $a, затем увеличивает $a на единицу | |
--$a | Пре-декремент | Уменьшает $a на единицу и возвращает $a | |
$a-- | Пост-декремент | Возвращает $a, затем уменьшает $a на единицу |
Определение при помощи array()
array ([key] => value, [key1] => value1, ... )
Языковая конструкция array() принимает в качестве параметров пары ключ => значение, разделенные запятыми. Символ => устанавливает соответствие между значением и его ключом. Ключ может быть как целым числом, так и строкой, а значение может быть любого имеющегося в PHP типа. Числовой ключ массива часто называют индексом. Индексирование массива в PHP начинается с нуля. Значение элемента массива можно получить, указав после имени массива в квадратных скобках ключ искомого элемента. Если ключ массива представляет собой стандартную запись целого числа, то он рассматривается как число, в противном случае – как строка. Поэтому запись $a["1"] равносильна записи $a[1], так же как и $a["-1"] равносильно $a[-1].
<?php $books = array ("php" => "PHP users guide", 12 => true); echo $books["php"]; //выведет "PHP users guide" echo $books[12]; //выведет 1 ?>
Пример 2.9. Массивы в PHP (html, txt)
Если для элемента ключ не задан, то в качестве ключа берется максимальный числовой ключ, увеличенный на единицу. Если указать ключ, которому уже было присвоено какое-то значение, то оно будет перезаписано. Начиная с PHP 4.3.0, если максимальный ключ – отрицательное число, то следующим ключом массива будет ноль (0).
<?php // массивы $arr и $arr1 эквиваленты $arr = array(5 => 43, 32, 56, "b" => 12); $arr1 = array(5 => 43, 6 => 32, 7 => 56, "b" => 12); ?>
Пример 2.10. Массивы в PHP (html, txt)
Если использовать в качестве ключа TRUE или FALSE, то его значение переводится соответственно в единицу и ноль типа integer. Если использовать NULL, то вместо ключа получим пустую строку. Можно использовать и саму пустую строку в качестве ключа, при этом ее надо брать в кавычки. Так что это не то же самое, что использование пустых квадратных скобок. Нельзя использовать в качестве ключа массивы и объекты.
Определение с помощью синтаксиса квадратных скобок
Создать массив можно, просто записывая в него значения. Как мы уже говорили, значение элемента массива можно получить с помощью квадратных скобок, внутри которых нужно указать его ключ например, $book["php"]. Если указать новый ключ и новое значение например, $book["new_key"]="new_value", то в массив добавится новый элемент. Если мы не укажем ключ, а только присвоим значение $book[]="new_value", то новый элемент массива будет иметь числовой ключ, на единицу больший максимального существующего. Если массив, в который мы добавляем значения, еще не существует, то он будет создан.
<? $books["key"]= value; // добавили в массив // $books значение // value с ключом key $books[] = value1; /* добавили в массив значение value1 с ключом 13, поскольку максимальный ключ у нас был 12 */ ?>
Для того чтобы изменить конкретный элемент массива, нужно просто присвоить ему с его ключом новое значение. Изменить ключ элемента нельзя, можно только удалить элемент (пару ключ/значение) и добавить новую. Чтобы удалить элемент массива, нужно использовать функцию unset().
<?php $books = array ("php" => "PHP users guide", 12 => true);
$books[] = "Book about Perl"; // добавили элемент // с ключом (индексом) // 13 это эквивалентно // $books[13] = // "Book about Perl"; $books["lisp"] = 123456; /* Это добавляет к массиву новый элемент с ключом "lisp" и значением 123456 */ unset($books[12]); // Это удаляет элемент // c ключом 12 из массива unset ($books); // удаляет массив полностью ?>
Заметим, что, когда используются пустые квадратные скобки, максимальный числовой ключ ищется среди ключей, существующих в массиве с момента последнего переиндексирования. Переиндексировать массив можно с помощью функции array_values().
<?php $arr = array ("a","b","c"); /* Создаем массив со значениями "a", "b" и "c". Поскольку ключи не указаны, они будут 0,1,2 соответственно */ print_r($arr); // выводим массив (и ключи, // и значения) unset($arr[0]); unset($arr[1]); unset($arr[2]); // удаляем из него все значения print_r($arr); // выводим массив (и ключи, // и значения) $arr[] = "aa"; // добавляем новый элемент // в массив. // Его индексом (ключом) // будет 3, а не 0 print_r($arr);
$arr = array_values($arr); // переиндексируем // массив $arr[] = "bb"; // ключом этого элемента // будет 1 print_r($arr); ?>
Пример 2.11. Переиндексация массива (html, txt)
Результатом работы этого скрипта будет:
Array ( [0] => a [1] => b [2] => c ) Array ( ) Array ( [3] => aa ) Array ( [0] => aa [1] => bb )
Основной синтаксис
Первое, что нужно знать относительно синтаксиса PHP, – это то, как он встраивается в HTML-код, как интерпретатор узнает, что это код на языке PHP. В предыдущей лекции мы уже говорили об этом. Повторяться не будем, отметим только, что в примерах мы чаще всего будем использовать вариант <?php ?>, и иногда сокращенный вариант <? ?>.
Переменные
Переменная в PHP обозначается знаком доллара, за которым следует ее имя. Например:
$my_var
Имя переменной чувствительно к регистру, т.е. переменные $my_var и $My_var различны.
Имена переменных соответствуют тем же правилам, что и остальные наименования в PHP: правильное имя переменной должно начинаться с буквы или символа подчеркивания с последующими в любом количестве буквами, цифрами или символами подчеркивания.
В PHP 3 переменные всегда присваивались по значению. То есть когда вы присваиваете выражение переменной, все значения оригинального выражения копируются в эту переменную. Это означает, к примеру, что после присвоения одной переменной значения другой изменение одной из них не влияет на значение другой.
<?php $first = ' Text '; // Присваиваем $first // значение // ' Text ' $second = $first; // Присваиваем $second // значение // переменной $first $first = ' New text '; // Изменяем // значение // $first // на ' New text ' echo "Переменая с именем first " . "равна $first <br>"; // выводим значение $first echo "Переменая с именем second " . "равна $second"; // выводим значение $second ?>
Пример 2.2. Присваивание по значению (html, txt)
Результат работы этого скрипта будет следующим:
Переменная с именем first равна New text Переменная с именем second равна Text
PHP 4, кроме этого, предлагает еще один способ присвоения значений переменным: присвоение по ссылке. Для того чтобы присвоить значение переменной по ссылке, это значение должно иметь имя, т.е. оно должно быть представлено какой-либо переменной. Чтобы указать, что значение одной переменной присваивается другой переменной по ссылке, нужно перед именем первой переменной поставить знак амперсанд &.
Рассмотрим тот же пример, что и выше, только будем присваивать значение переменной first переменной second по ссылке:
<?php $first = ' Text '; // Присваиваем $first // значение ' Text ' $second = &$first; /* Делаем ссылку на $first через $second. Теперь значения этих переменных будут всегда совпадать */ // Изменим значение $first // на ' New text ' $first = ' New text '; echo "Переменная с именем first " . "равна $first <br>"; // выведем значения обеих переменных echo "Переменная с именем second " . "равна $second"; ?>
Пример 2.3. Присваивание по ссылке (html, txt)
Этот скрипт выведет следующее:
Переменная с именем first равна New text. Переменная с именем second равна New text.
То есть вместе с переменной $first изменилась и переменная $second.
Переменные, константы и операторы
Важным элементом каждого языка являются переменные, константы и операторы, применяемые к этим переменным и константам. Рассмотрим, как выделяются и обрабатываются эти элементы в PHP.
Это многострочный комментарий. Здесь можно
<?php echo "Меня зовут Вася"; // Это однострочный комментарий // в стиле С++ echo "Фамилия моя Петров"; /* Это многострочный комментарий. Здесь можно написать несколько строк. При исполнении программы все, что находится здесь (закомментировано), будет игнорировано. */ echo "Я изучаю PHP в INTUIT.ru"; # Это комментарий в стиле # оболочки Unix ?> |
Пример 2.1. Использование комментариев в PHP |
Закрыть окно |
<?php $first = ' Text '; // Присваиваем $first // значение // ' Text ' $second = $first; // Присваиваем $second // значение // переменной $first $first = ' New text '; // Изменяем // значение // $first // на ' New text ' echo "Переменая с именем first " . "равна $first <br>"; // выводим значение $first echo "Переменая с именем second " . "равна $second"; // выводим значение $second ?> |
Пример 2.2. Присваивание по значению |
Закрыть окно |
<?php $first = ' Text '; // Присваиваем $first // значение ' Text ' $second = &$first; /* Делаем ссылку на $first через $second. Теперь значения этих переменных будут всегда совпадать */ // Изменим значение $first // на ' New text ' $first = ' New text '; echo "Переменная с именем first " . "равна $first <br>"; // выведем значения обеих переменных echo "Переменная с именем second " . "равна $second"; ?> |
Пример 2.3. Присваивание по ссылке |
Закрыть окно |
<?php // определяем константу // PASSWORD define("PASSWORD","qwerty"); // определяем регистронезависимую // константу PI со значением 3.14 define("PI","3.14", True); // выведет значение константы PASSWORD, // т.е. qwerty echo (PASSWORD); // тоже выведет qwerty echo constant("PASSWORD"); echo (password); /* выведет password и предупреждение, поскольку мы ввели регистрозависимую константу PASSWORD */ echo pi; // выведет 3.14, поскольку константа PI // регистронезависима по определению ?> |
Пример 2.4. Константы в PHP |
Закрыть окно |
<?php $test = True; ?> |
Пример 2. 5. Логический тип |
Закрыть окно |
<?php // Оператор '==' проверяет равенство // и возвращает // булево значение if ($know == False) { // если $know // имеет значение // false echo "Изучай PHP!"; } if (!$know) { // то же самое, что // и выше, т.е. проверка // имеет ли $know значение // false echo "Изучай PHP!"; } /* оператор == проверяет, совпадает ли значение переменной $action со строкой "Изучить PHP". Если совпадает, то возвращает true, иначе – false. Если возвращено true, то выполняется то, что внутри фигурных скобок */ if ($action == "Изучить PHP") { echo "Начал изучать"; } ?> |
Пример 2.6. Использование логического типа |
Закрыть окно |
<?php echo 'Также вы можете вставлять в строки символ новой строки таким образом, поскольку это нормально'; // Выведет: Чтобы вывести ' надо // перед ней поставить \ echo 'Чтобы вывести \' надо перед ' 'ней поставить \\'; // Выведет: Вы хотите удалить C:\*.*? echo 'Вы хотите удалить C:\\*.*?'; // Выведет: Это не вставит: \n // новую строку echo 'Это не вставит: \n новую строку'; // Выведет: Переменные $expand также // $either не подставляются echo 'Переменные $expand также $either' . 'не подставляются'; ?> |
Пример 2.7. Использование управляющих последовательностей |
Закрыть окно |
<?php $str = <<<EOD Пример строки, охватывающей несколько строчек, с использованием heredoc-синтаксиса EOD; // Здесь идентификатор – EOD. Ниже // идентификатор EOT $name = 'Вася'; echo <<<EOT Меня зовут "$name". EOT; // это выведет "Меня зовут "Вася"." ?> |
Пример 2.8. Использование heredoc-синтаксиса |
Закрыть окно |
<?php $books = array ("php" => "PHP users guide", 12 => true); echo $books["php"]; //выведет " PHP users guide" echo $books[12]; //выведет 1 ?> |
Пример 2.9. Массивы в PHP |
Закрыть окно |
<?php // массивы $arr и $ arr1 эквиваленты $arr = array(5 => 43, 32, 56, "b" => 12); $arr1 = array(5 => 43, 6 => 32, 7 => 56, "b" => 12); ?> |
Пример 2.10. Массивы в PHP |
Закрыть окно |
<?php $arr = array ("a","b","c"); /* Создаем массив со значениями "a", "b" и "c". Поскольку ключи не указаны, они будут 0,1,2 соответственно */ print_r($arr); // выводим массив (и ключи, // и значения) unset($arr[0]); unset($arr[1]); unset($arr[2]); // удаляем из него все значения print_r($arr); // выводим массив (и ключи, // и значения) $arr[] = "aa"; // добавляем новый элемент // в массив. // Его индексом (ключом) // будет 3, а не 0 print_r($arr); $arr = array_values($arr); // переиндексируем // массив $arr[] = "bb"; // ключом этого элемента // будет 1 print_r($arr); ?> |
Пример 2.11. Переиндексация массива |
Закрыть окно |
<?php // создаем класс людей class Person { // метод, который обучает человека PHP function know_php() { echo "Теперь я знаю PHP"; } } $bob = new Person; // создаем объект // класса человек $bob -> know_php(); // обучаем его PHP ?> |
Пример 2.12. Объекты в PHP |
Закрыть окно |
Разделение инструкций
Программа на PHP (да и на любом другом языке программирования) – это набор команд (инструкций). Обработчику программы (парсеру) необходимо как-то отличать одну команду от другой. Для этого используются специальные символы – разделители. В PHP инструкции разделяются так же, как и в Cи или Perl, – каждое выражение заканчивается точкой с запятой.
Закрывающий тег «?>» также подразумевает конец инструкции, поэтому перед ним точку с запятой не ставят. Например, два следующих фрагмента кода эквивалентны:
<?php echo "Hello, world!"; // точка с запятой // в конце команды // обязательна ?> <?php echo "Hello, world!" ?> <!-- точка с запятой опускается из-за "?>" -->
Решение задачи
Теперь вернемся к задаче, которую мы поставили в самом начале лекции. Напомним, что она состояла в составлении письма разным людям по поводу разных событий. Попытаемся использовать для решения этой задачи изученные средства – переменные, операторы, константы, строки и массивы. В зависимости от получателя изменяется событие и обращение, указанные в письме, поэтому естественно вынести эти величины в переменные. Более того, поскольку событий и людей много, удобно использовать переменные типа массив. Подпись в письме остается постоянной всегда, поэтому логично задать ее как константу. Чтобы не писать слишком длинные и громоздкие строки, используем оператор конкатенации. Итак, вот что получилось:
<? // пусть наша подпись // будет константой define("SIGN","С уважением, Вася"); // зададим массивы людей и событий $names = array("Иван Иванович", "Петр Петрович", "Семен Семенович"); $events = array( "f" => "день открытых дверей", "o" => "открытие выставки", "p" => "бал выпускников");
// составим текст приглашения $str = "Уважаемый (ая), $names[0]"; $str .= "<br>Приглашаем Вас на ". $events["f"]; $str .= "<br>" . SIGN; echo $str; // выведем текст на экран ?>
Тип array (массив)
Массив в PHP представляет собой упорядоченную карту – тип, который преобразует значения в ключи. Этот тип оптимизирован в нескольких направлениях, поэтому вы можете использовать его как собственно массив, список (вектор), хеш-таблицу (являющуюся реализацией карты), стэк, очередь и т.д. Поскольку вы можете иметь в качестве значения другой массив PHP, можно также легко эмулировать деревья.
Определить массив можно с помощью конструкции array() или непосредственно задавая значения его элементам.
Тип boolean (булев или логический тип)
Этот простейший тип выражает истинность значения, то есть переменная этого типа может иметь только два значения – истина TRUE или ложь FALSE.
Чтобы определить булев тип, используют ключевое слово TRUE или FALSE. Оба регистронезависимы.
<?php $test = True; ?>
Пример 2.5. Логический тип (html, txt)
Логические переменные используются в различных управляющих конструкциях (циклах, условиях и т.п., более подробно речь о них пойдет в одной из следующих лекций). Иметь логический тип, т.е. принимать только два значения, истину или ложь, могут также и некоторые операторы (например, оператор равенства). Они также используются в управляющих конструкциях для проверки каких-либо условий. Например, в условной конструкции проверяется истинность значения оператора или переменной и в зависимости от результата проверки выполняются те или иные действия. Здесь условие может быть истинно или ложно, что как раз и отражает переменная и оператор логического типа.
<?php // Оператор '==' проверяет равенство // и возвращает // булево значение if ($know == False) { // если $know // имеет значение // false echo "Изучай PHP!"; } if (!$know) { // то же самое, что // и выше, т.е. проверка // имеет ли $know значение // false echo "Изучай PHP!"; } /* оператор == проверяет, совпадает ли значение переменной $action со строкой "Изучить PHP". Если совпадает, то возвращает true, иначе – false. Если возвращено true, то выполняется то, что внутри фигурных скобок */ if ($action == "Изучить PHP") { echo "Начал изучать"; } ?>
Пример 2.6. Использование логического типа (html, txt)
Тип float (числа с плавающей точкой)
Числа с плавающей точкой (они же числа двойной точности или действительные числа) могут быть определены при помощи любого из следующих синтаксисов:
<?php $a = 1.234; $b = 1.2e3; $c = 7E-10; ?>
Размер числа с плавающей точкой зависит от платформы, хотя максимум, как правило, ~1.8e308 с точностью около 14 десятичных цифр.
Тип integer (целые)
Этот тип задает число из множества целых чисел Z = {..., -2, -1, 0, 1, 2, ...}. Целые могут быть указаны в десятичной, шестнадцатеричной или восьмеричной системе счисления, по желанию с предшествующим знаком «-» или «+».
Если вы используете восьмеричную систему счисления, вы должны предварить число 0 (нулем), для использования шестнадцатеричной системы нужно поставить перед числом 0x.
<?php # десятичное число $a = 1234; # отрицательное число $a = -123; # восьмеричное число (эквивалентно # 83 в десятичной системе) $a = 0123; # шестнадцатеричное число (эквивалентно # 26 в десятичной системе) $a = 0x1A; ?>
Размер целого зависит от платформы, хотя, как правило, максимальное значение около двух миллиардов (это 32-битное знаковое). Беззнаковые целые PHP не поддерживает.
Если вы определите число, превышающее пределы целого типа, оно будет интерпретировано как число с плавающей точкой. Также если вы используете оператор, результатом работы которого будет число, превышающее пределы целого, вместо него будет возвращено число с плавающей точкой.
В PHP не существует оператора деления целых. Результатом 1/2 будет число с плавающей точкой 0.5. Вы можете привести значение к целому, что всегда округляет его в меньшую сторону, либо использовать функцию round(), округляющую значение по стандартным правилам. Для преобразования переменной к конкретному типу нужно перед переменной указать в скобках нужный тип. Например, для преобразования переменной $a=0.5 к целому типу необходимо написать (integer)(0.5) или (integer) $a или использовать сокращенную запись (int)(0.5). Возможность явного приведения типов по такому принципу существует для всех типов данных (конечно, не всегда значение одного типа можно перевести в другой тип). Мы не будем углубляться во все тонкости приведения типов, поскольку PHP делает это автоматически в зависимости от контекста.
Тип Null
Специальное значение NULL говорит о том, что переменная не имеет значения.
Переменная считается NULL, если:
ей была присвоена константа NULL ($var = NULL); ей еще не было присвоено какое-либо значение; она была удалена с помощью unset().
Существует только одно значение типа NULL – регистронезависимое ключевое слово NULL.
Тип object (объекты)
Объекты – тип данных, пришедший из объектно-ориентированного программирования (ООП). Согласно принципам ООП, класс – это набор объектов, обладающих определенными свойствами и методами работы с ним, а объект соответственно – экземпляр класса. Например, программисты – это класс людей, которые пишут программы, изучают компьютерную литературу и, кроме того, как все люди, имеют имя и фамилию. Теперь, если взять одного конкретного программиста, Васю Иванова, то можно сказать, что он является объектом класса программистов, обладает теми же свойствами, что и другие программисты, тоже имеет имя, пишет программы и т.п.
В PHP для доступа к методам объекта используется оператор ->. Для инициализации объекта используется выражение new, создающее в переменной экземпляр объекта.
<?php //создаем класс людей class Person { // метод, который обучает человека PHP function know_php() { echo "Теперь я знаю PHP"; } } $bob = new Person; // создаем объект // класса человек $bob -> know_php(); // обучаем его PHP ?>
Пример 2.12. Объекты в PHP (html, txt)
Более подробно реализацию принципов ООП в языке PHP мы рассмотрим в одной из следующих лекций.
Тип resource (ресурсы)
Ресурс – это специальная переменная, содержащая ссылку на внешний ресурс (например, соединение с базой данных). Ресурсы создаются и используются специальными функциями (например, mysql_connect(), pdf_new() и т.п.).
Тип string (строки)
Строка – это набор символов. В PHP символ – это то же самое, что байт, это значит, что существует ровно 256 различных символов. Это также означает, что PHP не имеет встроенной поддержки Unicode. В PHP практически не существует ограничений на размер строк, поэтому нет абсолютно никаких причин беспокоиться об их длине.
Строка в PHP может быть определена тремя различными способами:
с помощью одинарных кавычек; с помощью двойных кавычек; heredoc-синтаксисом.
Типы данных
PHP поддерживает восемь простых типов данных.
Четыре скалярных типа:
boolean (логический); integer (целый); float (с плавающей точкой); string (строковый).
Два смешанных типа:
array (массив); object (объект).
И два специальных типа:
resource (ресурс); NULL.
В PHP не принято явное объявление типов переменных. Предпочтительнее, чтобы это делал сам интерпретатор во время выполнения программы в зависимости от контекста, в котором используется переменная. Рассмотрим по порядку все перечисленные типы данных.
в этой лекции мы познакомились
Итак, в этой лекции мы познакомились с основами синтаксиса языка PHP, научились работать с переменными различных типов, константами, операторами, познакомились со всеми существующими в PHP типами данных. Говоря о таких типах данных, как строки и массивы, мы разобрали только самые основы. Эти конструкции настолько удобны и просты в использовании, что заслуживают отдельного разговора. Подробности будут изложены в последующих лекциях. Решая задачу, мы старались использовать только имеющиеся знания и не забегать вперед, поэтому решение не слишком подходит для практического применения. В следующей лекции мы исправим этот недостаток и создадим более универсальный шаблон электронного письма.
Альтернативный синтаксис
PHP предлагает альтернативный синтаксис для некоторых своих управляющих структур, а именно для if, while, for, foreach и switch. В каждом случае открывающую скобку нужно заменить на двоеточие (:), а закрывающую – на endif;, endwhile; и т.д. соответственно.
Например, синтаксис оператора if можно записать таким образом:
if(выражение): блок_выполнения endif;
Смысл остается тем же: если условие, записанное в круглых скобках оператора if, оказалось истиной, будет выполняться весь код, от двоеточия «:» до команды endif;. Использование такого синтаксиса полезно при встраивании php в html-код.
<?php $names = array("Иван","Петр","Семен"); if ($names[0]=="Иван"): ?> Привет, Ваня! <?php endif ?>
Пример 3.4. Использование альтернативного синтаксиса (html, txt)
Если используются конструкции else и elseif, то также можно задействовать альтернативный синтаксис:
<?php if ($a == 5): print "a равно 5"; print "..."; elseif ($a == 6): print "a равно 6"; print "!!!"; else: print "a не равно ни 5, ни 6"; endif; ?>
Break
Оператор break заканчивает выполнение текущего цикла, будь то for, foreach, while, do..while или switch. break может использоваться с числовым аргументом, который говорит, работу скольких управляющих структур, содержащих его, нужно завершить.
<?php $i=1; while ($i) { $n = rand(1,10); // генерируем произвольное число // от 1 до 10 echo "$i:$n "; // выводим номер итерации и // сгенерированное число if ($n==5) break; /* Если было сгенерировано число 5, то прекращаем работу цикла. В этом случае все, что находится после этой строчки внутри цикла, не будет выполнено */ echo "Цикл работает <br>"; $i++; } echo "<br>Число итераций цикла $i "; ?>
Пример 3.8. Оператор break (html, txt)
Результатом работы этого скрипта будет примерно следующее:
1:7 Цикл работает 2:2 Цикл работает 3:5 Число итераций цикла 3
Если после оператора break указать число, то прервется именно такое количество содержащих этот оператор циклов. В приведенном выше примере это неактуально, поскольку вложенных циклов нет. Немного изменим наш скрипт:
<?php $i=1; while ($i) { $n = rand(1,10); // генерируем произвольное число // от 1 до 10 switch ($n){ case 5: echo "<font color=blue> Выход из switch (n=$n)</font>"; break 1; // прекращаем работу switch // (первого содержащего break цикла) case 10: echo "<font color=red> Выход из switch и while (n=$n)</font>"; break 2; // прекращаем работу switch и while // (двух содержащих break циклов) default: echo "switch работает (n=$n), "; } echo " while работает – шаг $i <br>"; $i++; } echo "<br>Число итераций цикла $i "; ?>
Циклы
В PHP существует несколько конструкций, позволяющих выполнять повторяющиеся действия в зависимости от условия. Это циклы while, do..while, foreach и for. Рассмотрим их более подробно.
Continue
Иногда нужно не полностью прекратить работу цикла, а только начать его новую итерацию. Оператор continue позволяет пропустить дальнейшие инструкции из блока_выполнения любого цикла и продолжить выполнение с нового круга. continue можно использовать с числовым аргументом, который указывает, сколько содержащих его управляющих конструкций должны завершить работу.
Заменим в примере предыдущего параграфа оператор break на continue. Кроме того, ограничим число шагов цикла четырьмя.
<?php $i=1; while ($i<4) { $n = rand(1,10); // генерируем произвольное число // от 1 до 10 echo "$i:$n "; // выводим номер итерации и // сгенерированное число if ($n==5) { echo "Новая итерация "; continue;
/* Если было сгенерировано число 5, то начинаем новую итерацию цикла, $i не увеличивается */ } echo "Цикл работает <br>"; $i++; } echo "<br>Число итераций цикла $i "; ?>
Результатом работы этого скрипта будет
1:10 Цикл работает 2:5 Новая итерация 2:1 Цикл работает 3:1 Цикл работает Число итераций цикла 4
Заметим, что после выполнения оператора continue работа цикла не заканчивается. В примере счетчик цикла не меняется в случае получения числа 5, поскольку он находится после оператора continue. Фактически с помощью continue мы пытаемся избежать ситуации, когда будет сгенерировано число 5. Поэтому можно было просто написать, заменив оператор continue на проверку истинности выражения:
<?php $i=1; while ($i<4) { $n = rand(1,10); // генерируем произвольное число // от 1 до 10 if ($n!==5) { echo "$i:$n <br>"; // выводим номер итерации // и сгенерированное число $i++; } } ?>
В PHP существует одна особенность использования оператора continue – в конструкциях switch он работает так же, как и break. Если switch находится внутри цикла и нужно начать новую итерацию цикла, следует использовать continue 2.
Do... while
Циклы do..while очень похожи на циклы while, с той лишь разницей, что истинность выражения проверяется в конце цикла, а не в начале. Благодаря этому блок_выполнения цикл do...while гарантированно выполняется хотя бы один раз.
Структура:
do {блок_выполнения} while (выражение);
<? // эта программа напечатает число 12, несмотря на то // что условие цикла не выполнено $i = 12; do{ if ($i % 2 == 0) print $i; // если число четное, то печатаем его $i++; // увеличиваем число на единицу }while ($i<10) ?>
Пример 3.6. Оператор do..while (html, txt)
For
Это самые сложные циклы в PHP. Они напоминают соответствующие циклы C.
Структура:
for (выражение1; выражение2; выражение3) {блок_выполнения}
либо
for (выражение1; выражение2; выражение3): блок_выполнения endfor;
Здесь, как мы видим, условие состоит сразу из трех выражений. Первое выражение выражение1 вычисляется безусловно один раз в начале цикла. В начале каждой итерации вычисляется выражение2. Если оно является True, то цикл продолжается и выполняются все команды блока_выполнения. Если выражение2 вычисляется как False, то исполнение цикла останавливается. В конце каждой итерации (т.е. после выполнения всех команд блока_выполнения) вычисляется выражение3.
Каждое из выражений 1, 2, 3 может быть пустым. Если выражение2 является пустым, то это значит, что цикл должен выполняться неопределенное время (в этом случае PHP считает это выражение всегда истинным). Это не так бесполезно, как кажется, ведь цикл можно останавливать, используя оператор break.
Например, все четные цифры можно вывести с использованием цикла for таким образом:
<?php for ($i=0; $i<10; $i++){ if ($i % 2 == 0) print $i; // печатаем четные числа } ?>
Если опустить второе выражение (условие $i<10), то такую же задачу можно решить, останавливая цикл оператором break.
<?php for ($i=0; ; $i++){ if ($i>=10) break; // если $i больше или равно 10, // то прекращаем работу цикла if ($i % 2 == 0) print $i; // если число четное, // то печатаем его } ?>
Можно опустить все три выражения. В этом случае просто не будет задано начальное значение счетчика $i и оно не будет изменяться каждый раз в конце цикла. Все эти действия можно записать в виде отдельных команд либо в блоке_выполнения, либо перед циклом:
<?php $i=0; // задаем начальное значение счетчика for ( ; ; ){ if ($i>=10) break; // если $i больше или равно 10, // то прекращаем работу цикла if ($i % 2 == 0) print $i; // если число четное, // то печатаем его $i++; // увеличиваем счетчик на единицу } ?>
В третье выражение конструкции for можно записывать через запятую сразу несколько простейших команд. Например, если мы хотим просто вывести все цифры, то программу можно записать совсем просто:
<?php for ($i=0; $i<10; print $i, $i++) /* Если блок_выполнения не содержит команд или содержит только одну команду, фигурные скобки, в которые он заключен, можно опускать*/ ?>
Foreach
Еще одна полезная конструкция. Она появилась только в PHP4 и предназначена исключительно для работы с массивами.
Синтаксис:
foreach ($array as $value) {блок_выполнения}
либо
foreach ($array as $key => $value) {блок_выполнения}
В первом случае формируется цикл по всем элементам массива, заданного переменной $array. На каждом шаге цикла значение текущего элемента массива записывается в переменную $value, и внутренний счетчик массива передвигается на единицу (так что на следующем шаге будет виден следующий элемент массива). Внутри блока_выполнения значение текущего элемента массива может быть получено с помощью переменной $value. Выполнение блока_выполнения происходит столько раз, сколько элементов в массиве $array.
Вторая форма записи в дополнение к перечисленному выше на каждом шаге цикла записывает ключ текущего элемента массива в переменную $key, которую тоже можно использовать в блоке_выполнения.
Когда foreach начинает исполнение, внутренний указатель массива автоматически устанавливается на первый элемент.
<?php $names = array("Иван","Петр","Семен"); foreach ($names as $val) { echo "Привет, $val <br>"; // выведет всем приветствие } foreach ($names as $k => $val) { // кроме приветствия, // выведем номера в списке, т.е. ключи echo "Привет, $val ! Ты в списке под номером $k <br>"; } ?>
Пример 3.7. Оператор foreach (html, txt)
Include
Оператор include позволяет включать код, содержащийся в указанном файле, и выполнять его столько раз, сколько программа встречает этот оператор. Включение может производиться любым из перечисленных способов:
include 'имя_файла'; include $file_name; include ("имя_файла");
Пример 3.9. Пусть в файле params.inc у нас хранится набор каких-то параметров и функций. Каждый раз, когда нам нужно будет использовать эти параметры (функции), мы будем вставлять в текст нашей основной программы команду include 'params.inc'.
params.inc <?php $user = "Вася"; $today = date("d.m.y"); /* функция date() возвращает дату и время (здесь – дату в формате день.месяц.год) */ ?>
include.php <?php include ("params.inc"); /* переменные $user и $today заданы в файле params.inc. Здесь мы тоже можем ими пользоваться благодаря команде include("params.inc") */
echo "Привет, $user!<br>"; // выведет "Привет, Вася!" echo "Сегодня $today"; // выведет, например, "Сегодня 7.07.05" ?>
Пример 3.9. Использование оператора включения include (html, txt)
Заметим, что использование оператора include эквивалентно простой вставке содержательной части файла params.inc в код программы include.php. Может быть, тогда можно было в params.inc записать простой текст без всяких тегов, указывающих на то, что это php-код? Нельзя! Дело в том, что в момент вставки файла происходит переключение из режима обработки PHP в режим HTML. Поэтому код внутри включаемого файла, который нужно обработать как PHP-скрипт, должен быть заключен в соответствующие теги.
Поиск файла для вставки происходит по следующим правилам.
Сначала ведется поиск файла в include_path относительно текущей рабочей директории.Если файл не найден, то поиск производится в include_path относительно директории текущего скрипта.Параметр include_path, определяемый в файле настроек PHP, задает имена директорий, в которых нужно искать включаемые файлы.
Например, ваш include_path это . (то есть текущая директория), текущая рабочая директория это /www/. В основной файл include.php вы включаете файл my_dir/a.php, который в свою очередь включает b.php. Тогда парсер первым делом ищет файл b.php в директории /www/, и если такового нет, то в директории /www/my_dir/.
Если файл включен с помощью include, то содержащийся в нем код наследует область видимости переменных строки, где появился include. Любые переменные вызванного файла будут доступны в вызывающем файле с этой строки и далее. Соответственно, если include появляется внутри функции вызывающего файла, то код, содержащийся в вызываемом файле, будет вести себя так, как будто он был определен внутри функции. Таким образом, он унаследует область видимости этой функции. Хотя мы и не знакомились еще с понятием функции, все же приводим здесь эти сведения в расчете на интуитивное его понимание.
Пример 3.10. Пусть файл для вставки params.inc останется таким же, а include.php будет следующим:
<?php function Footer(){ // объявляем функцию с именем Footer include ("params.inc"); /* включаем файл params.inc. Теперь его переменными можно пользоваться, но только внутри функции */ $str = "Сегодня: $today <br>"; $str .= "<a href='mailto:help@intuit.ru'>Страницу создал $user</a>"; echo "$str"; } Footer(); // вызываем функцию Footer(). Получим: //Сегодня: 08.07.05 //Страницу создал Вася
echo "$user, $today"; // выведет запятую, так как // эти переменные видны только // внутри функции ?>
Пример 3.10. Область видимости при использовани include (html, txt)
Кроме локальных файлов, с помощью include можно включать и внешние файлы, указывая их url-адреса. Данная возможность контролируется директивой url_fopen_wrappers в файле настроек PHP и по умолчанию, как правило, включена. Но в версиях PHP для Windows до PHP 4.3.0 эта возможность не поддерживается совсем, вне зависимости от url_fopen_wrappers.
include() – это специальная языковая конструкция, поэтому при использовании внутри условных блоков ее нужно заключать в фигурные скобки.
<?php /* Это неверная запись. Получим ошибку. Мы же вставляем не одну команду, а несколько, они только записаны в другом файле */ if ($condition) include("first.php"); else include("second.php"); // А вот так правильно. if ($condition){ include("first.php"); } else { include("second.php"); } ?>
Пример 3.11. Использование include() (html, txt)
При использовании include возможны два вида ошибок – ошибка вставки (например, нельзя найти указанный файл, неверно написана сама команда вставки и т.п.) или ошибка исполнения (если ошибка содержится во вставляемом файле). В любом случае при ошибке в команде include исполнение скрипта не завершается.
Оператор else
Мы рассмотрели только одну, основную часть оператора if. Существует несколько расширений этого оператора. Оператор else расширяет if на случай, если проверяемое в if выражение является неверным, и позволяет выполнить какие-либо действия при таких условиях.
Структуру оператора if, расширенного с помощью оператора else, можно представить следующим образом:
if (выражение) блок_выполнения else блок_выполнения1
Эту конструкцию if...else можно интерпретировать примерно так: если выполнено условие (т.е. выражение=true), то выполняем действия из блока_выполнения, иначе – действия из блока_выполнения1. Использовать оператор else не обязательно.
Посмотрим, как можно изменить предыдущий пример, учитывая необходимость совершения действий и в случае невыполнения условия.
<? $names = array("Иван","Петр","Семен"); if ($names[0]=="Иван") { echo "Привет, Ваня!"; $num = 1; $account = 2000; } else { echo "Привет, $names[0]. А мы ждали Ваню :("; } if ($num) echo "Иван первый в списке!"; else echo "Иван НЕ первый в списке?!"; $bax = 30; if ($account > 100*$bax+3) echo "Эта строка не появится на экране, так как условие не выполнено"; else echo "Зато появится эта строка!"; ?>
Пример 3.2. Оператор else (html, txt)
Оператор elseif
Еще один способ расширения условного оператора if – использование оператора elseif. elseif – это комбинация else и if. Как и else, он расширяет if для выполнения различных действий в том случае, если условие, проверяемое в if, неверно. Но в отличие от else, альтернативные действия будут выполнены, только если elseif-условие является верным. Структуру оператора if, расширенного с помощью операторов else и elseif, можно представить следующим образом:
if (выражение) блок_выполнения elseif(выражение1) блок_выполнения1 ... else блок_выполненияN
Операторов elseif может быть сразу несколько в одном if-блоке. Elseif-утверждение будет выполнено, только если предшествующее if-условие является False, все предшествующие elseif-условия являются False, а данное elseif-условие – True.
<? $names = array("Иван","Петр","Семен"); if ($names[0]=="Иван") { // если первое имя в массиве Иван echo "Привет, Ваня!"; }elseif ($names[0] == "Петр"){ // если первое имя // не Иван, а Петр echo "Привет, Петя!"; }elseif ($names[0] == "Семен"){ // если первое имя не // Иван, не Петр, а Семен echo "Привет, Сеня!"; }else { // если первое имя не Иван, // не Петр и не Семен echo "Привет, $names[0]. А ты кто такой?"; } ?>
Пример 3.3. Оператор elseif (html, txt)
Оператор if
Это один из самых важных операторов многих языков, включая PHP. Он позволяет выполнять фрагменты кода в зависимости от условия. Структуру оператора if можно представить следующим образом:
if (выражение) блок_выполнения
Здесь выражение есть любое правильное PHP-выражение (т.е. все, что имеет значение). В процессе обработки скрипта выражение преобразуется к логическому типу. Если в результате преобразования значение выражения истинно (True), то выполняется блок_выполнения. В противном случае блок_выполнения игнорируется. Если блок_выполнения содержит несколько команд, то он должен быть заключен в фигурные скобки { }.
Правила преобразования выражения к логическому типу:
В FALSE преобразуются следующие значения: логическое Falseцелый ноль (0)действительный ноль (0.0)пустая строка и строка "0"массив без элементовобъект без переменных (подробно об объектах будет рассказано в одной из следующих лекций)специальный тип NULLВсе остальные значения преобразуются в TRUE.
<? $names = array("Иван","Петр","Семен"); if ($names[0]=="Иван") { echo "Привет, Ваня!"; $num = 1; $account = 2000; } if ($num) echo "Иван первый в списке!"; $bax = 30; if ($account > 100*$bax+3) echo "Эта строчка не появится на экране, так как условие не выполнено"; ?>
Пример 3.1. Условный оператор if (html, txt)
Оператор switch
Еще одна конструкция, позволяющая проверять условие и выполнять в зависимости от этого различные действия, – это switch. На русский язык название данного оператора можно перевести как «переключатель». И смысл у него именно такой. В зависимости от того, какое значение имеет переменная, он переключается между различными блоками действия. switch очень похож на оператор if...elseif...else или набор операторов if. Структуру switch можно записать следующим образом:
switch (выражение или переменная){ case значение1: блок_действий1 break; case значение2: блок_действий2 break; ... default: блок_действий_по_умолчанию }
В отличие от if, здесь значение выражения не приводится к логическому типу, а просто сравнивается со значениями, перечисленными после ключевых слов case (значение1, значение 2 и т.д.). Если значение выражения совпало с каким-то вариантом, то выполняется соответствующий блок_действий – от двоеточия после совпавшего значения до конца switch или до первого оператора break, если таковой найдется. Если значение выражения не совпало ни с одним из вариантов, то выполняются действия по умолчанию (блок_действий_по_умолчанию), находящиеся после ключевого слова default. Выражение в switch вычисляется только один раз, а в операторе elseif – каждый раз, поэтому, если выражение достаточно сложное, то switch работает быстрее.
Пример 3.3 можно переписать с использованием switch следующим образом:
<? $names = array("Иван","Петр","Семен"); switch ($names[0]){ case "Иван": echo "Привет, Ваня!"; break; case "Петр": echo "Привет, Петя!"; break; case "Семен": echo "Привет, Сеня!"; break; default: echo "Привет, $names[0]. А как Вас зовут?"; } ?>
Если в этом примере опустить оператор break, например, в case "Петр":, то, если переменная окажется равной строке "Петр", после вывода на экран сообщения "Привет, Петя!" программа пойдет дальше и выведет также сообщение "Привет, Сеня!" и только потом, встретив break, продолжит свое выполнение за пределами switch.
Для конструкции switch, как и для if, возможен альтернативный синтаксис, где открывающая switch фигурная скобка заменяется двоеточием, а закрывающая – endswitch; соответственно.
Операторы передачи управления
Иногда в случае особых обстоятельств требуется немедленно завершить работу цикла и передать управление первой инструкции программы, расположенной за последней инструкцией цикла. Для этого используют операторы break и continue.
Эта строчка не появится на
<? $names = array("Иван","Петр","Семен"); if ($names[0]=="Иван") { echo "Привет, Ваня!"; $num = 1; $account = 2000; } if ($num) echo "Иван первый в списке!"; $bax = 30; if ($account > 100*$bax+3) echo " Эта строчка не появится на экране, так как условие не выполнено"; ?> |
Пример 3.1. Условный оператор if |
Закрыть окно |
<? $names = array("Иван","Петр","Семен"); if ($names[0]=="Иван") { echo "Привет, Ваня!"; $num = 1; $account = 2000; } else { echo "Привет, $names[0]. А мы ждали Ваню :("; } if ($num) echo "Иван первый в списке!"; else echo "Иван НЕ первый в списке?!"; $bax = 30; if ($account > 100*$bax+3) echo " Эта строка не появится на экране, так как условие не выполнено"; else echo "Зато появится эта строка!"; ?> |
Пример 3.2. Оператор else |
Закрыть окно |
<? $names = array("Иван","Петр","Семен"); if ($names[0]=="Иван") { // если первое имя в массиве Иван echo "Привет, Ваня!"; }elseif ($names[0] == "Петр"){ // если первое имя // не Иван, а Петр echo "Привет, Петя!"; }elseif ($names[0] == "Семен"){ // если первое имя не // Иван, не Петр, а Семен echo "Привет, Сеня!"; }else { // если первое имя не Иван, // не Петр и не Семен echo "Привет, $names[0]. А ты кто такой?"; } ?> |
Пример 3.3. Оператор elseif |
Закрыть окно |
<?php $names = array("Иван","Петр","Семен"); if ($names[0]=="Иван"): ?> Привет, Ваня! <?php endif ?> |
Пример 3.4. Использование альтернативного синтаксиса |
Закрыть окно |
<? // эта программа напечатает все четные цифры $i = 1; while ($i < 10) { if ($i % 2 == 0) print $i; // печатаем цифру, если она четная $i++; // и увеличиваем $i на единицу } ?> |
Пример 3.5. Оператор while |
Закрыть окно |
<? // эта программа напечатает число 12, несмотря на то // что условие цикла не выполнено $i = 12; do{ if ($i % 2 == 0) print $i; // если число четное, то печатаем его $i++; // увеличиваем число на единицу }while ($i<10) ?> |
Пример 3.6. Оператор do..while |
Закрыть окно |
<?php $names = array("Иван","Петр","Семен"); foreach ($names as $val) { echo "Привет, $val <br>"; // выведет всем приветствие } foreach ($names as $k => $val) { // кроме приветствия, // выведем номера в списке, т.е. ключи echo "Привет, $val ! Ты в списке под номером $k <br>"; } ?> |
Пример 3.7. Оператор foreach |
Закрыть окно |
<?php $i=1; while ($i) { $n = rand(1,10); // генерируем произвольное число // от 1 до 10 echo "$i:$n "; // выводим номер итерации и // сгенерированное число if ($n==5) break; /* Если было сгенерировано число 5, то прекращаем работу цикла. В этом случае все, что находится после этой строчки внутри цикла, не будет выполнено */ echo "Цикл работает <br>"; $i++; } echo "<br>Число итераций цикла $i "; ?> |
Пример 3.8. Оператор break |
Закрыть окно |
params.inc <?php $user = "Вася"; $today = date("d.m.y"); /* функция date() возвращает дату и время (здесь – дату в формате день.месяц.год) */ ?> include.php <?php include ("params.inc"); /* переменные $user и $today заданы в файле params.inc. Здесь мы тоже можем ими пользоваться благодаря команде include("params.inc") */ echo "Привет, $user!<br>"; // выведет "Привет, Вася!" echo "Сегодня $today"; // выведет, например, "Сегодня 7.07.05" ?> |
Пример 3.9. Использование оператора включения include |
Закрыть окно |
<?php function Footer(){ // объявляем функцию с именем Footer include ("params.inc"); /* включаем файл params.inc. Теперь его переменными можно пользоваться, но только внутри функции */ $str = "Сегодня: $today <br>"; $str .= "<a href='mailto:help@intuit.ru'>Страницу создал $user</a>"; echo "$str"; } Footer(); // вызываем функцию Footer(). Получим: //Сегодня: 08.07.05 //Страницу создал Вася echo "$user, $today"; // выведет запятую, так как // эти переменные видны только // внутри функции ?> |
Пример 3.10. Область видимости при использовани include |
Закрыть окно |
<?php /* Это неверная запись. Получим ошибку. Мы же вставляем не одну команду, а несколько, они только записаны в другом файле */ if ($condition) include("first.php"); else include("second.php"); // А вот так правильно. if ($condition){ include("first.php"); } else { include("second.php"); } ?> |
Пример 3.11. Использование include() |
Закрыть окно |
<?php define("SIGN","С уважением, Вася"); // пусть наша подпись // будет константой // информация о событиях $events = array( "f" => "день открытых дверей", "o" => "открытие выставки", "p" => "бал выпускников"); // имеющаяся информация о людях // (имя и электронный адрес) $people = array( "ivan" => array( "name" => "Иван Иванович", "email"=>"user_ivan@intuit.ru"), "pit" => array( "name" => "Петр Петрович", "email" => "user_petr@intuit.ru"), "semen" => array( "name" => "Семен Семенович")); // кто куда приглашается $who_where["ivan"] = "o" ; // Иван – на выставку $who_where["pit"] = "p"; // Петр – на бал ?> |
Листинг 3.12. data.php |
Закрыть окно |
<?php require("data.php"); // включаем файл с данными о событиях foreach($people as $key => $man_info){ // для каждого человека делаем следующее: $event_key = $who_where[$key]; // получаем событие, // на которое он приглашается if ($event_key<>""){ foreach($man_info as $key1 => $info){ // получаем имя и email // конкретного человека if ($key1=="name") $str = "Уважаемый (ая), $info"; if ($key1=="email") $email = $info; } // составляем приглашение $str .= "<br>Приглашаем Вас на ". $events[$event_key]; switch ($event_key){ // в зависимости от события // добавляем какую-нибудь строчку case "f": $str .= "<br>Подтвердите Ваше участие по телефону!"; break; case "o": $str .= "<br>Приходите за 15 минут до открытия!"; break; case "p": $str .= "<br>Не забудьте подарок :-)"; break; } $str .= "<br>" . SIGN . "<hr>"; // добавляем подпись echo $str; // вводим приглашение на экран /* если у вас настроена отправка почты с помощью PHP, то письмо можно отправить командой mail($email,"Letter",$str); */ } } ?> |
Листинг 3.13. letters.php |
Закрыть окно |
Require
Этот оператор действует примерно так же, как и #include в C++. Все, что мы говорили о include, лишь за некоторыми исключениями, справедливо и для require. Require также позволяет включать в программу и исполнять какой-либо файл. Основное отличие require и include заключается в том, как они реагируют на возникновение ошибки. Как уже говорилось, include выдает предупреждение, и работа скрипта продолжается. Ошибка в require вызывает фатальную ошибку работы скрипта и прекращает его выполнение.
Условные операторы на require() не влияют. Хотя, если строка, в которой появляется этот оператор, не исполняется, то ни одна строка кода из вставляемого файла тоже не исполняется. Циклы также не влияют на require(). Хотя код, содержащийся во вставляемом файле, является объектом цикла, но вставка сама по себе происходит только однажды.
В реализациях PHP до версии 4.0.2 использование require() означало, что интерпретатор обязательно попытается прочесть вставляемый файл.
require, как и include, при использовании внутри условных блоков нужно заключать в фигурные скобки.
в начале лекции. Мы хотим
И наконец, вернемся к задаче, сформулированной в начале лекции. Мы хотим создать программу, которую можно было бы использовать для отправки писем (или просто для их генерации) с приглашениями на различные мероприятия множеству пользователей. В предыдущей лекции уже рассматривался подобный случай. Сейчас мы вынесем всю информацию о людях и событиях в отдельный файл data.php и напишем программу, не зависящую (ну, может, совсем чуть-чуть зависящую) от этой информации и ее структуры. В этом случае для того, чтобы, например, расширить список адресатов, не нужно будет изменять скрипт, генерирующий приглашения. Кроме того, можно будет использовать информацию о людях и событиях в других скриптах. В самом скрипте, генерирующем приглашения letters.php, мы использовали условные операторы, циклы, require и другие изученные ранее конструкции.
<?php define("SIGN","С уважением, Вася"); // пусть наша подпись // будет константой
// информация о событиях $events = array( "f" => "день открытых дверей", "o" => "открытие выставки", "p" => "бал выпускников"); // имеющаяся информация о людях // (имя и электронный адрес) $people = array( "ivan" => array( "name" => "Иван Иванович", "email"=>"user_ivan@intuit.ru"), "pit" => array( "name" => "Петр Петрович", "email" => "user_petr@intuit.ru"), "semen" => array( "name" => "Семен Семенович")); // кто куда приглашается $who_where["ivan"] = "o" ; // Иван – на выставку $who_where["pit"] = "p"; // Петр – на бал ?>
Листинг 3.12. data.php (html, txt)
<?php require("data.php"); // включаем файл с данными о событиях foreach($people as $key => $man_info){ // для каждого человека делаем следующее: $event_key = $who_where[$key]; // получаем событие, // на которое он приглашается if ($event_key<>""){ foreach($man_info as $key1 => $info){ // получаем имя и email // конкретного человека if ($key1=="name") $str = "Уважаемый (ая), $info"; if ($key1=="email") $email = $info; } // составляем приглашение $str .= "<br>Приглашаем Вас на ". $events[$event_key]; switch ($event_key){ // в зависимости от события // добавляем какую-нибудь строчку case "f": $str .= "<br>Подтвердите Ваше участие по телефону!"; break; case "o": $str .= "<br>Приходите за 15 минут до открытия!"; break; case "p": $str .= "<br>Не забудьте подарок :-)"; break; } $str .= "<br>" . SIGN . "<hr>"; // добавляем подпись
echo $str; // вводим приглашение на экран
/* если у вас настроена отправка почты с помощью PHP, то письмо можно отправить командой mail($email,"Letter",$str); */ } } ?>
Листинг 3.13. letters.php (html, txt)
While
Структура:
while (выражение) { блок_выполнения }
либо
while (выражение): блок_выполнения endwhile;
while – простой цикл. Он предписывает PHP выполнять команды блока_выполнения до тех пор, пока выражение вычисляется как True (здесь, как и в if, происходит приведение выражения к логическому типу). Значение выражения проверяется каждый раз в начале цикла, так что, даже если его значение изменилось в процессе выполнения блока_выполнения, цикл не будет остановлен до конца итерации (т.е. пока все команды блока_выполнения не будут исполнены).
<? //эта программа напечатает все четные цифры $i = 1; while ($i < 10) { if ($i % 2 == 0) print $i; // печатаем цифру, если она четная $i++; // и увеличиваем $i на единицу } ?>
Пример 3.5. Оператор while (html, txt)
мы завершили изучение управляющих конструкций
Итак, мы завершили изучение управляющих конструкций языка PHP. Мы старались привести самое основное и не углубляться в различные нюансы тех или иных конструкций. Подробную информацию можно найти в руководстве по PHP.