Дайте мне хороший сценарий, и я сверну горы.
Люк Бессон
Зачем создателю сайта нужны языки серверных сценариев?
В статье, посвященной базам данных из прошлого номера нашего журнала (положите ее рядом – она сейчас еще пригодится) вы уже читали о различиях между статическими и динамическими сайтами (их по-другому называют еще пассивными и активными). Главные отличия динамического сайта в том, что
во-первых, содержимое его страниц формируется «на лету», на основе данных, хранящихся в базе данных, а не заготовлено заранее (пример — лента новостей); во-вторых, есть обратная связь с посетителями – сайт активно взаимодействует с ними через формы, содержащие поля для ввода данных (пример — гостевая книга, или возможность комментировать материалы и читать эти комментарии); и в-третьих, у него, как правило, разделены фронтальная часть (для взаимодействия с пользователями) и служебная (для взаимодействия с администраторами сайта, наполняющими его содержимым).Добавление страницы в статический сайт – работа достаточно нудная: надо загрузить на сервер новый материал (как правило, по протоколу FTP) и прописать на него ссылки из нескольких мест – иначе про новую статью никто никогда не узнает. Служебная часть сильно облегчает эту задачу: ссылки будут сформированы автоматически.
Обычно люди приходят к необходимости создания динамических сайтов, когда разросшийся объем хранящейся информации или желание часто ее обновлять требуют использования того, что на программистском жаргоне называют «движком» сайта, а официально — CMS (content management system), то есть системой управления содержимым. Создание такого движка невозможно без привлечения сценариев, выполняемых на стороне веб-сервера. Именно эти сценарии как помещают содержимое на сайт, так и формируют внешний вид страниц «на лету».
Как работают сценарии? Языки сценариев
Что происходит, когда вы открываете в браузере (Internet Explorer, Opera, FireFox или любой другой) страницу какого-нибудь сайта?
браузер, он же веб-клиент, запрашивает страницу, обращаясь к веб-серверу (чаще всего это Apache, реже — IIS). если веб-сервер обнаруживает на запрошенной странице обращения к сценариям, то обращается к их интерпретаторам, которые выполняют сценарии и формируют на их основе или всю страницу, или отдельные ее фрагменты. И, наконец, веб-сервер отсылает сформированную страницу на клиентскую сторону, то есть в окно браузера посетителя сайта.Собственно, динамические сайты как раз и отличаются от статических тем, что без второго этапа не обойтись. Существенная часть различий между языками сценариев определяются именно тем, как они выполняют этот этап. Ну и, разумеется, синтаксис тоже играет роль.
Наиболее распространенные языки сценариев со свободно распространяемыми кодами для веб-сервера Apache - PHP, Perl и Python. Все они достаточно гибкие и допускают подключение новых модулей, библиотек и т. п. Все они выполняются на стороне сервера. Это и обеспечивает быстродействие (из-за возможности использовать ресурсы мощных серверов), и гарантирует исполнение (пользователь не может отключить выполнение программы), и не позволяет посетителям сайта видеть исходные коды сценариев.
Исключительная же популярность языка PHP связана с тем, что, в отличие, скажем, от Perl, он позволяет внедрять текст сценария непосредственно в HTML-текст страницы и выполнять сценарий в контексте основного процесса обработки HTML.
История создания PHP | ||
В 1994 году датский программист (ныне живущий в Канаде) Расмус Лердорф (Rasmus Lerdorf) написал набор скриптов для обработки шаблонов HTML-документов. Вначале этот инструментарий был написан им на Perl, но когда возможностей этого языка по функциональности и быстроте перестало хватать, Лердорф создал на языке C собственный интерпретатор шаблонов и назвал его PHP/FI (Personal Home Page / Forms Interpreter — «Личная домашняя страница / Интерпретатор форм»). Поскольку коды нового инструмента были открыты и свободно распространяемы, это привело к их быстрому расширению и продвижению силами энтузиастов из различных стран. В 1997 году вторую версию интерпретатора PHP/FI 2 использовали около 50 тысяч (около 1% на тот момент) интернет-сайтов мира. |
Настоящая же революция в PHP произошла в 1998 году, когда два израильских программиста Энди Гутманс (Andi Gutmans) и Зив Сураски (Zeev Suraski) из израильского института Технион переписали код с нуля, посчитав существовавшую на то время версию не пригодной для разработки приложений электронной коммерции, над которыми они тогда работали. Так появился PHP 3 — почти тот PHP, который мы знаем сегодня: язык с модульной структурой, позволяющей расширять возможности ядра независимо работающими программистами со всего света. В третьей версии появилась поддержка огромного множества платформ, веб-серверов, интернет-протоколов и т.п. Кроме того, в языке сильно изменился синтаксис. Он стал более удобным, более мощным и, что особенно важно, объектно-ориентированным.
Это интересно: появление настолько переработанной версии привело к новой расшифровке аббревиатуры языка. Новая, ставшая теперь уже официальной расшифровка - «PHP: Hypertext Preprocessor» - является рекурсивной, то есть ссылающейся на саму себя. Есть, впрочем, и ряд неофициальных расшифровок. Так, из-за легкости изучения и не всегда высокой квалификации разработчиков аббревиатуру иногда расшифровывают иногда как «People Have Problems».
Победное шествие PHP 3 по всемирной паутине было впечатляющим: уже к концу 1998 года он использовался в 10% веб-сайтов интернета. С тех пор возможности PHP и его распространенность выросли многократно. На веб-серверах сегодня иcпользуются в основном PHP 4 (его поддержка прекращена совсем недавно) и PHP 5, а на стадии тестирования находится PHP 6.
Немного практики
Как PHP-сценарии встраиваются в HTML-страницу?
Существует несколько синтаксически различных конструкций для внедрения PHP-кода в HTML-текст страницы. Самый ходовой из них:
...
?>
Все, что будет написано вместо троеточия между этими окаймляющими тегами, и есть PHP-сценарий.
Этот сценарий выполнится целиком на стороне веб-сервера. В результате выполнения будет создан фрагмент HTML-текста, который и будет показан пользователю. Даже любопытный пользователь, открыв у себя в браузере исходный код HTML-страницы, эти теги, в отличие от кода на JavaScript, не увидит. Так, в этом простейшем примере
echo ("
Журнал «Лучшие компьютерные игры»
");?>
вместо блока PHP-сценария в ходе серверной обработки возникнет HTML-строка.
На страницу эту строку выведет встроенная функция echo, синтаксис которой достаточно понятен. Именно с такой строкой страница вернется в браузер к читателю сайта. Увидит же он ее в виде отдельного абзаца с выделенным жирным стилем названием журнала (сработают вставленные в строку HTML-теги и кавычки-ёлочки):
Журнал «Лучшие компьютерные игры»
Хотя PHP-сценарии и можно встраивать в HTML-страницы, они могут существовать и автономно, в отдельных файлах. Это очень удобно для создания больших сайтов – общий код хранится в одном экземпляре. Что самое важное – при этом и ошибки исправлять приходится только в одном месте.
Комментарии
Проще всего показать, как используются комментарии, нарастив ими предыдущий пример.
# Это комментарий в одну строку, оформленный в стиле UNIX
echo ("
Журнал «Лучшие компьютерные игры»
"); // комментарий до конца строки (стиль С)/*
Многострочный комментарий в стиле С.
В нем можно поместить не ограниченный по размеру текст
*/
?>
Эти комментарии будут игнорироваться при синтаксическом анализе PHP-кода и, в отличие от HTML-комментариев, не покажутся конечным пользователям при просмотре исходного текста страницы. Они нужны только разработчикам, чтобы документировать собственные действия.
Переменные и константы
Переменные в PHP, как и в любом другом языке программирования, служат для именованного хранения данных. Для тех, кому никогда раньше не приходилось программировать, проще всего представить себе переменную в виде некой коробочки с именем, из которой мы можем извлекать хранимое значение, менять его и класть на хранение обратно. Переменные в PHP делятся на скалярные (хранящие одно значение) и массивы (хранящие множество значений).
Имена переменных в PHP всегда начинаются со знака доллара ($), за которым следуют буквенно-цифровые символы и знаки подчеркивания. Первый символ цифрой быть не может. Следует помнить, что имена переменных, в отличие от ключевых слов языка, чувствительны к регистру!
Скалярные переменные
Основные типы скалярных переменных в PHP - это логические величины (принимающие значения «истина» или «ложь»), целые и вещественные числа, а также строки. Явно указывать, что же именно хранится в переменной, не обязательно, хотя и можно. Тип устанавливается во время присваивания переменной первого значения, но в ходе выполнения программы может много раз измениться. Вот так можно объявить переменные и присвоить им начальные значения:
$qty = 13.5;
$sql = "SELECT * FROM goods";
Массивы
Массив — это набор нумерованных значений. Нумерация всегда начинается с нуля. Существуют различные способы инициализации массивов. Вот один из них:
$languages = array ("PHP", "Perl", "Python");
Здесь создан массив из трех строковых элементов. Если мы выполним команду echo($languages[2]), то в браузер будет выведен элемент «Python» (нумерация ведь начинается с 0!).
Этот же массив можно было создать и иначе:
$languages[0] = "PHP";
$languages[1] = "Perl";
$languages[2] = "Python";
Или даже так:
$languages[] = "PHP";
$languages[] = "Perl";
$languages[] = "Python";
Нумерация при этом будет произведена автоматически, но строго последовательно.
Константы
Константы используются для задания постоянных величин. Они объявляются в РНР при помощи функции define():
define(MIN_NUM, 1);
define(MAX_NUM, 100);
?>
Здесь объявлены две целочисленные константы: MIN_NUM и MAX_NUM. Основное отличие их от переменных в том, что значения им не присваиваются в ходе выполнения программы, а подменяют их символические обозначения еще до начала ее выполнения.
Простые операторы
Константы и переменные — это лишь данные, которые сами по себе не представляли бы интерес, если бы не существовало способов ими манипулировать. Для совершения действий и служат операторы. Существуют различные типы операторов: присваивания, арифметические, логические, условные и т.д. С оператором присваивания мы уже сталкивались, когда рассматривали инициализацию переменных. Арифметические операторы мало чем отличаются от того, что есть в других языках:
$b = 7;
$a = $b - 2;
$a = $a + 1;
При работе со строками важную роль играет оператор конкатенации, сшивающий несколько строк в одну. Роль плюса в арифметических операторах здесь играет точка «.». Так, в следующем примере три слова, хранящиеся в переменных $s1, $s2, $s3, будут сшиты в одну фразу, а между ними будут вставлены пробелы.
$s1 = "Лучшие";
$s2 = "компьютерные";
$s3 = "игры";
echo ($s1 . " " . $s2 . " " . $s3);
// в браузере появится строка "Лучшие компьютерные игры"
?>
Управляющие операторы
Любая программа, на каком бы языке она ни была написана, выполняет последовательность операторов. В ходе выполнения программы приходится менять эту последовательность в зависимости от условий или выполнять одни и те же действия с разными данными. Для этого и нужны управляющие операторы.
Условный оператор if...elseif...else
Рассмотрим условный оператор на примере, проверяющем (если уж база посвящена товарам) цену, которая для них указана.
if ($price < 20) {
echo ("Очень дешевый товар");
} elseif ($price > 100) {
echo ("Дорогой товар");
} else {
echo ("Товар по разумной цене");
}
Разумеется, условий elseif мы можем написать сколько угодно.
Операторы цикла while и for
В отличие от условного оператора if, который проверяет каждое условие один раз и действует в зависимости от истинности или ложности результата, оператор while продолжает выполняться, пока его условие остается истинным. Итак, в приведенном ниже примере переменная $s накапливает в себе сумму всех натуральных чисел от 1 до 100:
$s = 0;
$i = 1;
while ($i style="color:#990000"><= 100) {
$s = $s+$i;
$i++;
}
echo ("Сумма = $s");
Начальное значение суммы $s устанавливается в 0, а натуральное число $i принимается за 1. В ходе циклического выполнения сумма увеличивается на текущее натуральное число, после чего само это число увеличивается на 1 (оператор: $i++). Так продолжается до тех пор, пока $i не превысит 100 и, как следствие, оператор цикла не прекратит выполнение заложенных в него действий из-за нарушения своего условия.
Для выполнения той же самой задачи можно было использовать и цикл for. Запись оператора выглядит при этом проще:
$s = 0;
for ($i=1; $i <= 100; $i++) {
$s = $s+$i;
}
echo ("Сумма = $s");
Три выражения в цикле for, разделенные точкой с запятой, несут следующую смысловую нагрузку. Первое из них — инициализирующее. Второе определяет условие выхода из цикла (аналогично тому, как это делается в while). Третье условие определяет способ наращивания переменной цикла $i (в конце каждого набора действий она увеличивается на 1).
Функции
Функция — это законченный, самодостаточный и именованный участок кода, предназначенный к вызову из сценария или других функций. Если переменные — это кирпичики кода, операторы — небольшие его блоки, то процедуры — это уже оформленные строительные конструкции. На вход функции можно, но не обязательно, подать входные параметры, на выходе получается некий результат. Если сравнивать язык программирования с русским языком, то переменные, константы и ключевые слова играют в нем роль слов, операторы — знаков препинания, а функции — роль готовых текстов.
Строится простая собственная функция с двумя входными параметрами примерно так:
function some_func($argument1, $argument2) {
// тут расположен собственно текст функции
}
Программист может как писать собственные функции, так и использовать любую из готовых функций языка. Одну из них (echo) мы уже не один раз использовали в этой статье. Приведу еще несколько примеров часто используемых функций:
date() — возвращает текущие дату и время сервера; substr(строка, стартовая_позиция, [длина]) — возвращает часть строки с указанной начальной позиции и (не обязательно) указанной длины; strlen(строка) — возвращает количество символов в строке; die(сообщение) — выводит сообщение, после чего прерывает выполнение сценария; header() — выводит HEADER (заголовок) HTML-страницы; mail("адрес","тема","сообщение","от кого") — отправляет письмо с сервера (если на сервере все настроено); include(имя_файла) — вставляет в текст одного сценария фрагмент текста, хранящийся в отдельном файле.Как осуществляется обратная связь с сайтом через формы?
Именно возможность создания интерактивных страниц делает применение скриптовых языков столь привлекательным. Приведу пример простой HTML-страницы с формой, созданной для того, чтобы пользователь мог передать какую-то информацию обратно на сайт.
Все, что находится в этом HTML-коде между тегами style="color:#990000">
, относится к нашей форме. Посетитель сайта сможет через страницу формы в браузере ввести свое имя через однострочное поле «name» и сообщение - через многострочное поле «message». Обработка этих данных начнется после того, как пользователь нажмет на специальный элемент формы, имеющий тип «submit». В нашем случае это кнопка с надписью «Принять». Как именно форма будет обрабатываться, мы указали в атрибутах тега style="color:#990000">