Введение в PHP Предназначение Эта статья предназначена для разработчиков Web-страниц и программистов, рассматривающих PHP как альтернативный инструмент разработки Web-страниц. Здесь же описана история языка и его главные особенности. Как возник PHP PHP начал развитие как быстрый Perl-компилятор, написанный Расмусом Лердорфом в конце 1994. За следующие два-три года, он сформировался в то, что мы сегодня знаем как PHP/FI 2.0. Круг пользователей PHP/FI начал расширяться, но не был бы таким широким, если бы Зив Сураский и Энди Гутманс внезапно не предложили новый синтаксис языка летом 1997, подведя разработки тем самым к PHP 3.0. PHP 3.0 приобрел синтаксис и семантику, которые далее использовались в версиях 3 и 4. Почему все же другой язык? Люди часто спрашивают " почему изобретают все же другой язык; разве нам не хватает других языков"? Это просто вопрос о " правильном инструменте для правильной работы ". Много Web-разработчиков пришли к выводу, что существующие инструментальные средства и языки достойно не справляются с решением определенных задач по внедрения кода. Такие разработчики сначала сотрудничали с Расмусом, а затем позже и с Зивом и Энди, развивали язык как средство написания сценариев для сервера, что, по их мнению, позволило бы сделать его идеальным для разработки динамических Web-сайтов и приложений. PHP был создан с учетом всех этих специфических потребностей. Кроме того, PHP код дорабатывался для непосредственного внедрения в HTML. Еще ожидалось, что такие цели, как быстрое время ответа, улучшенная защита и ясность языка для пользователя будут в конечном итоге достигнуты. Данные о том, что почти полтора миллиона сайтов в настоящее время используют PHP (по крайней мере, на время публикации этой статьи) говорят, что разработчики были правы. PHP развился в язык, или даже в среду, которая может решать очень специфические задачи. Для решения этих задач PHP, по скромному мнению Стига, довольно близко к идеальному инструменту. Архитектура PHP 4 PHP подвергся коренным изменениям по сравнению с версией 3. Прежде всего, грамматический разбор языка теперь проводит специальный встроенный в него компонент под названием Zend-Движок. Во-вторых, модули с описанием функций PHP, называемые теперь PHP-расширениями, хранятся отдельно. В-третьих, добавлен абстрактный Web-сервер - SAPI, который значительно упрощает подключение реальных Web-серверов. SAPI также повышает стабильность PHP 4 и осуществляет поддержку многопоточные Web-серверов. Следующий рисунок иллюстрирует архитектуру PHP 4. Верхняя граница рисунка обозначает программный интерфейс (здесь связано все, кроме Web-сервера): Архитектура PHP 4 SAPI позволяет подключать следующие Web-серверы: Apache, Roxen, Java (servlet), ISAPI (Микрософт IIS и скоро Zeus), AOLserver и конечно CGI. Все функции PHP - это связующие звенья между отдельными частями данного рисунка. Большинство функций, например, для поддержки MySQL, содержатся в определенном расширении. Расширения подключаются опционально. Они могут быть связаны в PHP между собой на этапе компиляции или прогонки программы как динамически загружаемые расширения по желанию пользователя. Синтаксис Языка Большая часть синтаксиса PHP заимствовано от C, хотя присутствуют элементы, заимствованные от Perl, C++ и Java. Эта статья предполагает, что Вы знакомы с синтаксисом C. Однако не паникуйте, если Вы этого не знаете. Внедрение PHP Кода Чтобы дать Вам объяснить, что влечет за собой внедрение PHP, рассмотрим три исчерпывающих себя примера вывода строки "привет мир": Пример 1: только HTML Привет, Мир! Пример 2: только PHP код <?php print " Привет, Мир!"; ?> Пример 3: PHP код, внедренный в HTML <?php print " Привет,"; ?> Мир! Web-серверы, поддерживающие PHP, по умолчанию просматривают файл в режиме HTML. Код HTML будет выдаваться браузеру как обычно до тех пор, пока сервер не наткнется на PHP код. Выше в примерах 2 и 3 тэг " <? php " сообщает серверу, что далее следует код PHP. В этот момент сервер переключается в режим просмотра PHP и далее ожидает команды PHP. Затем, когда сервер встречает тэг "? > ", он переключается с режима PHP в режим HTML и далее продолжает работу в этом режиме. Внедрение кода таким способом концептуально более гибкий подход к проектированию Web-страницы, потому что Вы работаете только с выводом, а именно с HTML-страницей. Более традиционным является разбиение вывода на отдельные части (заголовок (header), тело страницы (body), нижний колонтитул (footer) и т.д.), а затем помещать их в исходный код. Теперь мы передаем наш код непосредственно на вывод браузеру. После приведенного примера может возникнуть вопрос: " В чем же разница? " или " Зачем внедрять дополнительный код, когда HTML один может справиться с поставленной задачей? ". Читайте дальше! Динамическая Web-страница против Статической Пример с выводом строки " Привет, Мир ", который мы выбрали, конечно, не заставит Вас использоваться PHP. Дело в том, что это статический вывод, т.е. выводиться будет всегда одно и то же. Но что, если Вы хотели бы поприветствовать мир в другой форме, сказав, например, " Bonjour, Мир! " или " Yo, Мир! " и так далее. Так как HTML-тэги вполне наглядны, они не могут функционировать как переменные. При этом мы не сможем передавать в них другие варианты записи "Bonjour" или "Yo". Для этого Вам нужен язык команд, чтобы обрабатывать вносимые в Web-страницу изменения. Основанная на некотором условии или прямом вводе от пользователя, команда языка может генерировать "статический" HTML-код, необходимый для правильного отображения Web-страницы. Давайте пересмотрим пример 3. Теперь мы предоставим пользователю самому выбирать, как он хочет поприветствовать мир: Пример 4: PHP внедренный в пределах повторно посещенного HTML! <?php print $greeting, ", "; ?> Мир! В вышеупомянутом примере переменная $greeting получает некоторое значение и вместе с запятой и словом " Мир! " передается браузеру. Динамический дизайн Web-страницы является нечто большим, чем простой подстановкой переменных. А что, если бы Вы хотели не только приветствовать мир по-французски, а еще и отображать страницу, используя цвета французского флага? При динамическом дизайне могут быть одновременно настроены структура Web-страница и ее содержимое. Это означает, что динамическое программирование Web-страницы позволяет формировать саму Web-страницу по запросу пользователя извне. Теперь ничего статического! Переменные В PHP переменные не требуется объявлять заранее. Они будут созданы автоматически, как только им будет присвоено некоторое значение. Переменные начинаются со знака доллара: ($VariableName). Переменные не имеют объявленных типов. Тип переменной не является фиксированным, т.е. ее тип может меняться в течении всей жизни переменной. Ниже приведена таблица типов переменных в PHP: Тип Описание Integer Целое число Double Число с плавающей точкой bool1 Булевский тип (истина или ложь), доступен, начиная с PHP 4.0 Array Смесь упорядоченного и ассоциативного массива object2 Объект со свойствами и методами (в этой статье не освещается) В следующем примере четыре переменные создаются автоматически после присвоения им значений: <? php $number = 5; $string1 = " это - строка "; $string2 = ' это - другая "строка" '; $real = 37.2; ? > Массивы PHP массивы - это нечто среднее между нумерованными массивами и ассоциативными массивами. Это означает, что Вы можете использовать один и тот же синтаксис и те же функции для работы с любым типом массива, включая массивы, которые: Индексированны начиная с 0 Индексированны строками Индексированны конкретными числами Индексированны как числами, так и строками В примере ниже объявлены три массива со следующими свойствами: 1. Индексированный целыми числами массив из целых чисел с индексами от 0 до 4. 2. Ассоциативный массив с индексами-строками. 3. Индексированный целыми числами массив из строк с индексами от 5 до 7. <?php $array1 = array(2, 3, 5, 7, 11); $array2 = array("один" => 1, "два" => 2, "три" => 3); $array3 = array(5 => "пять", "шесть", "семь"); printf("7: %d, 1: %d, 'six': %s ", $array1[3], $array2["один"], $array3[6]); ?> В вышеописанном примере, индексы в массиве array1 заданы неявно, в то время как индексы в массиве array2 явно. Если мы присваиваем значение элементу массива с номером N при помощи оператора = >, то следующее значение по умолчанию будет присвоено элементу массива с номером N+1. Явные же индексы не имеют строгой последовательности. Вы можете также использовать смешанные индексы (например, строки и числа), но такое индексирование не рекомендуется. Условный Оператор и Операторы Цикла PHP включает условный оператор if и elseif и циклы while и for с синтаксисом как и в C. Ниже приведен пример реализации этих четырех конструкций: <?php // Условный оператор if ($a) { print "a есть истина<BR> "; } elseif ($b) { print "b есть истина<BR> "; } else { print "ни a, ни b не являются истинными<BR> "; } // Циклы do { $c = test_something(); } while ($c); while ($d) { print "хорошо<BR> "; $d = test_something(); } for ($i = 0; $i < 10; $i++) { print "i=$i<BR> "; } ?> Особенности Web-приложений Одна из самых старых особенностей PHP - способность создавать форму HTML и устанавливать данные cookies, что доступно непосредственно программисту. По умолчанию, любой вход в форму создаст глобальную переменную PHP с тем же названием. В следующем примере определяется имя пользователя и передается как значение переменной. Само имя печатается в блоке после "submit.php": <FORM METHOD="GET" ACTION="submit.php"> Как тебя зовут? <INPUT NAME="myname" SIZE=3> </FORM> submit.php <?php print "Привет, $myname!"; ?> В вышеупомянутом примере обратите внимание, что значения переменных могут быть выведены лишь в строках, заключенных в двойные кавычки. Для получения дополнительной информации о строках, обратитесь к обучающему блоку " Использование строк ". Работа с Cookies Вы можете установить cookies в браузере из PHP, используя функцию setcookie(). setcookie() добавляет заголовки (headers) к HTTP. Так как заголовки (headers) должны быть вставлены перед телом страницы (body), то Вы должны закончить все вызовы функции setcookie() до того, как будет осуществлен вывод тела (body) (обычно HTML). Следующий пример использует cookie, чтобы хранить значение формы, до тех пор, пока Ваш браузер продолжает свою работу: <?php if (!$myname) { print "Как тебя зовут? "; print "<FORM ACTION="$PHP_SELF" METHOD="GET"> "; print "<INPUT NAME="myname" SIZE=20> "; print "</FORM>"; exit; } setcookie("myname", $myname); ?> Для получения дополнительной информации по использованию cookies, обратитесь к обучающему блоку " Форма обратной связи с cookies ". Встроенные Переменные PHP имеет множество встроенных переменных, которые дают Вам возможность обращаться к среде CGI вашего Web-сервера, данным формы/cookies и внутренним переменным PHP. Вот некоторые наиболее полезные переменные: PHP внутренние переменные Переменные $GLOBALS и $PHP_SELF, показанные ниже в таблице, являются специфическими для PHP: Имя Переменной Описание $GLOBALS Ассоциативный массив всех глобальных переменных. Это единственная переменная в PHP, которая доступна всегда независимо от контекста. Вы можете к ней доступ в любом месте без объявления ее как глобальной переменной. $PHP_SELF Это текущий сценарий, например /~ssb/phpinfo.php3. CGI/Web-сервер переменные Переменные, перечисленные ниже, получены по протоколам CGI. Обратите внимание, что переменные $HTTP_*_VARS доступны только тогда, когда включена директива "track_vars". Вы можете задать директиве значение по умолчанию при установке PHP, установив в конфигурации условие "enable-track-vars". Также, Вы можете установить это в файле конфигурации php.ini или из конфигурации Вашего Web-сервера. Имя переменной Описание $DOCUMENT_ROOT Корневой каталог Вашего Web-сервера с доступными пользователю файлами. $REQUEST_METHOD Этот метод HTTP осуществляет доступ к данной странице через, например, GET или POST. $REQUEST_URI Полный локальный адрес URL, включая параметры. $HTTP_GET_VARS Ассоциативный массив с параметрами GET, посланных PHP, если имеются. $HTTP_POST_VARS Ассоциативный массив с параметрами POST, посланных PHP, если имеются. $HTTP_COOKIE _VARS Ассоциативный массив с cookies посланных браузеру, если имеются.. $SCRIPT_FILENAME Имя файла главной исполняемой страницы. $SCRIPT_NAME Локальный адрес URI, где находится исполняемая страница. $SERVER_ADMIN Электронный адрес (e-mail) администратора сервера. $SERVER_NAME Доменное имя сервера. $SERVER_PORT Номер TCP порта, где запущен сервер. $SERVER_PROTOCOL Протокол, по которому осуществляется доступ к странице, например, "HTTP/1.1". Переменные Запроса HTTP Переменные Запроса HTTP получены из соответствующих заголовков HTTP. Например, значение переменной $HTTP_USER_AGENT получено из заголовка User-Agent.Основные переменные представлены в таблице ниже: $HTTP_HOST Хост имя места, где "расположен" браузер. $HTTP_USER_AGENT Используемый "агент" пользователя - браузер. $HTTP_REFERER URL страницы, к которой происходит обращение. Работа с Базами Данных Связь с MySQL PHP и MySQL часто упоминаются как "динамический дуэт " для динамического создания Web-сценариев. PHP и MySQL прекрасно совместимы друг с другом в дополнении к их скорости и к особенностям каждого из них как индивидуального инструмента. Следующий простой пример покажет, как выгрузить содержание MySQL таблицы средствами PHP. Пример предполагает, что у нас есть пользователь MySQL с именем "nobody", который может подключиться без пароля с localhost: MySQL Пример Ниже в примере PHP совершает следующую последовательность действий: Подключение к MySQL. Посылка запроса. Печать заголовка таблицы. Печать строк таблицы, пока не будет достигнут конец таблицы. <?php //Подключаемся к базе данных на сервере как //пользователь "Nobody". $conn = mysql_connect("localhost", "nobody", ""); $res = mysql_query("SELECT * FROM mytable", $conn); $header_printed = false; print "<TABLE> "; do { $data = mysql_fetch_array($res); // Ищем следующую строку данных. if (!is_array($data)) { break; } // Эта часть лишь начальный этап цикла. Здесь печатаются // названия полей как заголовки таблицы в HTML. Это // гарантирует, что заголовки будут напечатаны, только если // база данных возвращает хотя бы одну строку, // иначе цикл прекратит свою работу. if (!$header_printed) { print " <TR>"; reset($data); while (list($name, $value) = each($data)) { print " <TH>$name</TH> " } print " </TR> "; $header_printed = true; } print " <TR> "; print " <TD>"; // Вместо циклического вывода содержимого поля, // мы используем implode, чтобы создать строку всех элементов данных // с соответствующим HTML между ними. print implode("</TD> <TD>", $data); print " </TR> "; } while ($data); print "</TABLE> "; ?> Связь с Другими Базами данных В отличие от других языков создания сценариев для разработки Web-страниц, PHP - общедоступный, независящий от платформы операционной системы язык, прекрасно совместимый с большинством современных баз данных, включая Oracle, Sybase, MySQL, ODBC (и другие). PHP также прекрасно внедряется в различные внешние библиотеки, что позволяет разрабатывать все, начиная с генерации документа PDF и заканчивая XML.
|