PHP - язык программирования для Интернета
Вы вышли за рамки статических www-страниц? Вам требуется
обрабатывать html-формы? Вы хотите сделать интефейс с базой данных
через веб? Электронный магазин? Счетчик с подробной статистикой или
опрос посетителей вашего сайта? Есть множество программ, работающих через интерфейс CGI, как
правило, написанных на языке Perl, но сегодня существуют и другие
возможности.
Почему PHP?
Perl - очень хороший, мощный язык, но слишком высоки системные
издержки во время вызова программы на каждый запрос страницы, особенно
в Windows. Существуют ли альтернативы? В последние годы быстро набирает
популярность язык программирования веб-приложений PHP (Personal Home
Page, www.php.net). В
1994 году Расмус Лердорф (Rasmus Lerdorf) начал разработку встроенного
в HTML языка программирования, исполняющегося на стороне сервера. Со
временем к проекту присоединились и другие разработчики, и сейчас PHP -
это бурно развивающееся средство программирования, работающее на очень
многих серверах в Интернете. Как средство разработки www-приложений PHP
сейчас лидирует - вместе с ASP, FrontPage и mod_perl.
Достаточно полно описать язык программирования и сопутствующие
инструментальные библиотеки в одной статье невозможно, однако можно
постараться: не описывая синтаксис или библиотечные функции, полезно
остановиться на особенностях создания скриптов на PHP. А с подробной
документацией по PHP можно ознакомиться на сайте
www.php.net/manual.
PHP можно установить в двух вариантах: как отдельный интерпретатор,
работающий через интерфейс CGI, или как модуль веб-сервера, встроенный
в сам сервер. В последнем случае становятся актуальными все
преимущества PHP.
Из аналогичных встроенных в сервер программных средств хорошо
известны SSI, mod_perl, ASP. Но SSI обладает довольно ограниченными
возможностями, а mod_perl, на мой взгляд, слишком много умеет.
Ближайшим аналогом PHP является ASP, но технология ASP не прижилась в
мире Unix/Apache, где простой, удобный и быстрый язык PHP постепенно
завоевывает первые ряды.
Сейчас распространена версия 3 интерпретатора PHP, версия 4 пока еще
находится в стадии бета-тестирования. Принципиальных отличий четвертой
версии от третьей нет, есть только несколько изменений синтаксиса
(описанных на сайте
www.php.net/version4/incompatibilities.php),
которые большинство пользователей не заметит: подавляющее большинство
скриптов будут работать в обеих версиях языка.
Как и все процедурные языки, PHP можно разделить на собственно язык
и библиотеку функций. Существует большое количество инструментальных
средств для PHP, интерфейсы ко всем популярным СУБД, почтовым
протоколам, к разделяемой памяти, графическим файлам, архивам и
множество других инструментов.
Основы языка PHP
Скрипт на PHP представляет собой файл, как правило, с суффиксом
.phtml, .php3 или .php, который внутри выглядит как обычная страница на
HTML. Отличие проявляется только в виде хитрого тега ,
делающего из HTML настоящий язык программирования. Часто применяют
сокращенную форму ?> или, для совместимости с визуальными
средствами формирования страниц, <% %>. Будем разумно
придерживаться традиции и пользоваться тегом ?>. Внутри этого
тега располагается код на языке PHP. Вот тривиальный пример страницы:
include('header.html' ?>
Это текст страницы
include('footer.html') ?>
Посетителю такой страницы будет показан документ с картинками, меню
и текстом, красиво упакованным в хитро вложенную таблицу. Отдельные
файлы header.html и
footer.html будут просто
включены в тот документ, что отдается сервером посетителю страницы.
Таким образом можно отделить оформление страницы от ее наполнения,
сильно облегчая работу по внесению информации на сайт даже
неквалифицированным работникам.
Текст скрипта выполняется сверху вниз и справа налево,
последовательно. Эта последовательность может быть изменена операторами
цикла и условными операторами. Например:
Тебя зовут
if ($name=='Вася') : ?>
Вася
else : ?>
капитан Немо
endif ?>
Здесь мы получим текст <Тебя зовут Вася> или <Тебя
зовут капитан Немо> в зависимости от значения переменной $name.
В примере видно, что мы прервали текст тегами PHP. В языке есть
несколько функций вывода - echo, printf и др., но приведенный в примере
код работает намного быстрее, чем, например, if ($name=='Вася') echo
'Вася'.
Перевод строки, идущий после закрытия тега ?>, интерпретатор
пропускает. Сделано это для удобства форматирования исходных текстов
скриптов.
Переменные в PHP отличаются наличием символа $ (доллар) перед именем
самой переменной. Объявлять их никак не надо, так как они создаются
автоматически при присвоении им значения и удаляются при выходе из
области действия. Переменные бывают типа строка, число, массив и
объект. Некоторые трудности может вызвать нестрогое отличие строк от
чисел. Поясню на примере:
$a=5; // Число
$b='6b'; // Строка
$c=$b.$a; // Строка: '6b5'
$d="$a$b"; // Строка: '56b'
$e=$a+$b; // Число: 11
$f=$b+$a; // Число: 11
?>
Интерпретатор очень вольно приводит типы строка и число друг к
другу. Хотя чаще всего это даже удобно. Просто надо об этом помнить и
не пытаться сравнивать строку с числом:
$a=5;
$b='ой!';
if ($a>$b) echo "1";
if ($b>$a) echo "2";
?>
В первом случае сравниваются числа 5 и 0 и результат, естественно,
положительный. А во втором случае что сравнивается? Документация на
этот счет молчит, а эксперимент показывает, что сравниваться будут тоже
числа. Согласен, что это не строго и не очень красиво, и в условных
операторах я рекомендую использовать операторы приведения типа, как в
языке Cи:
if ((int)$a < (int)$b) : ?>
или
if ((string)$a < (string)$b) : ?>
Синтаксис языка PHP вообще очень похож на синтаксис Си, если бы не
символы $ в начале имени переменных и некоторые вольности с типами и
массивами. Как в <Поднятой целине> председатель колхоза
английский учил: <... Английские слова такие же, как русские,
только в конце шипение какое-то, революшн, например...>
Для изменения типа переменной, в принципе, особенного ничего делать
не надо, достаточно просто присвоить ей значение нового типа:
$a=5; // Целое число
$a='5'; // Строка
$a=5.5; // Вещественное число
$a[0]=5; // Массив
$a['пять']=5; // Хэш-массив
?>
Последняя строка, например, показывает нам очень популярный и
удобный тип данных - хэш-массив (hash array). В принципе, это обычный
массив, только индексом у него выступает строка, а не целое число, и
никакого приведения типов, о котором я говорил ранее, здесь нет. PHP
позволяет создавать многомерные сооружения вида массив хэш-массивов,
как, например, $name[5]['ой'][6]= 'не может быть';
В принципе, массив - это тоже хэш, только в нем индексами являются
строки, соответствующие числам. Почему так хитро? Это еще ничего, а
вот, например, фраза $name[5]=0; создает массив $name из 6 элементов
(индексы считаются от 0, как в Си), но только 1 элемент реально
существует, остальные просто не определены. На практике это не сильно
мешает, помните только, что это не Cи и не Паскаль.
Конечно, не очень хорошо, но частенько удобно пользоваться
конструкциями
if ($test!='') : ?>
вместо правильной
if (isset($test) && $test!='') : ?>
просто потому, что первая запись короче. В первом случае, если
переменная $test будет не определена, то ее значение будет как бы
пустой строкой. Логично считать, что <никакая> строка - это
тоже пустая. Подобная фраза может вызвать предупреждение о
синтаксической ошибке, если администратор включил параноидальный
контроль синтаксиса, но это бывает редко. Если вам не лень, то
пользуйтесь правильными конструкциями и проверяйте наличие переменной
перед обращением к ней. А если лень, то считайте неопределенную
переменную пустой строкой, нулем, логической ложью и т. п.
Как-то специально объявлять массив или хэш тоже не надо. Но в
некоторых случаях это бывает полезно, например, если ваша функция
возвращает массив, то она должна вернуть именно массив, а не
неопределенное значение. Это, кстати, относится и к функциям:
function initArray($num) {
if ($num>0) return $a[$num]=$num;
return $a;
}
?>
Эта надуманная функция возвращает массив, если $num больше нуля, и
непределенное значение - в противном случае, что затрудняет работу с
результатом ее выполнения:
$foo=initArray(0);
...
$bar=$foo[0]; // Ошибка, $foo не массив.
...
?>
Здесь вам поможет функция array(), возвращающая массив, в том числе
и пустой. Либо стоит сразу инициализировать переменную $a=array() или
вернуть пустой массив как return array(). Первый вариант
предпочтительнее.
В PHP есть даже некоторая объектность, то есть вы можете создавать
классы, методы и т. д. Как правило, классы хороши в больших приложениях
или как средство ограничения области видимости переменных. Я бы не
рекомендовал очень уж активно ими пользоваться: помните, что объектный
подход нынче очень моден, но не стоит из него делать фетиш. Реализация
классов в PHP версии 4 обещает быть намного эффективнее, чем в третьей.
Поживем - увидим.
Примеры программирования на PHP
Как и для скриптов на языке Perl, в Интернете есть множество сайтов,
содержащих десятки готовых PHP-программ. Такие ресурсы делятся на два
вида: наборы функций или классы, - что отражает идеологический подход
авторов к программированию.
Программа на языке PHP, как правило, не живет сама по себе, а
применяется для обработки запросов через интерфейс CGI. Даже если
интерпретатор PHP встроен в сервер как модуль, с точки зрения самой
пользовательской программы, она, эта программа, работает через CGI. А
для чего творцам чудесных веб-сайтов нужен CGI? Конечно же, для
обработки форм. Именно на скрипт указывет параметр action-тега |