Лекція № 1
Тема: Структура програми в РНР. Стандартний вид РНР-сценарія.
План
Загальні поняття і опис РНР.
Перша програма (скрипт) на РНР.
Загальні поняття і опис РНР
Спершу познайомимося з самим РНР. Мова програмування РНР спеціально призначена для роботи в Інтернет, що поєднує достоїнства мов C і Perl. Синтаксис мови дуже сильно нагадує C — якщо ви програмуєте на C, то скоро ви це відмітите.
У офіційній документації мова РНР подається як server-side HTML-embedded scripting language, тобто, як вбудована в HTML скриптова мова з обробкою на сервері. Це означає наступне:
Обробка PHP-коду проводиться на стороні сервера ще до того, як Web-сторінка буде передана браузеру. Це, до речі, відрізняє мову РНР від мови JavaScript.
РНР-код може бути безпосередньо вбудований в HTML-код сторінки. Цим він відрізняється від Perl і відрізняється в кращу сторону.
Ми знаємо, що мови програмування бувають двох видів: інтерпретатори і компілятори. Чим же є РНР? Щоб з'ясувати це, нам потрібно розібратися в термінології. Програма, що переводить код, написаний на одній мові програмування, на іншій називається транслятором. Наприклад, програма р2с, яка переводить Pascal-код в С-код, є транслятором. Компілятор — це теж транслятор. Він переводить код, написаний на мові високого рівня, в машинний код. Мова високого рівня зрозуміла людині і близька до людського (Pascal, С, РНР), а машинний код (0 і 1) зрозумілий комп'ютеру — з двійковими даними комп'ютеру простіше працювати. В результаті роботи компілятора, як правило, створюється двійковий виконуваний файл (у Windows/DOS — з розширенням .ехе або com), який можна виконувати без допомоги компілятора.
Інтерпретатор — це абсолютно інший тип мови програмування, що не має нічого спільного з компілятором. Інтерпретатор нічого не переводить, а тільки виконує код. Він аналізує код програми і виконує кожну її строчку. Наприклад, припустимо, що інтерпретатор знайшов рядок «А = А + 7». Він аналізує і перевіряє її коректність, а потім шукає змінну А.. Якщо змінна була оголошена до рядка «А = А + 7», то інтерпретатор збільшує її значення на 7 — він виконує код. Була б замість рядка «А = А + 7» рядок print "Hello", наш інтерпретатор вивів би на екран рядок «Hello». Виконавши код, інтерпретатор не створює виконуваний файл, тому для наступного запуску вашого коду знову потрібний інтерпретатор.
По продуктивності інтерпретатори значно поступаються компілятору, оскільки машинний код виконується набагато швидше. Зате інтерпретатори дозволяють повністю контролювати програму під час її виконання.
РНР не є ні компілятором, ні інтерпретатором. РНР є щось середнє, між компілятором і інтерпретатором. Розглянемо, як РНР обробляє сценарії. На вхід РНР подається сценарій. Він переводить (транслює) його в спеціальний байт-код (внутрішнє уявлення). Потім РНР виконує байт-код (а не код самої програми!), при цьому він не створює виконуваний файл. Байт-код значно компактніший ніж звичайний код програми, тому його легше (і швидше) інтерпретувати (виконувати). Як бачите, РНР більше є інтерпретатором, ніж компілятором. Для чого потрібна була така подвійна робота — спочатку переводити у внутрішнє уявлення, а потім — виконувати? Невже не простіше відразу виконати кожен рядок програми?
Вдумайтеся в цей вираз «кожен рядок програми». Уявимо, що у нас є цикл:
for (I=0;I<10;I++)
{
оператор_1;
оператор_10 0;
}
Наш цикл «крутитиметься» не нескінченно, а всього лише десять разів. За кожний з цих десять проходів інтерпретатор повинен проаналізувати і виконати СТО рядків коду. Разом йому потрібно проаналізувати і виконати (я не дарма двічі згадую цю фразу) 10x100 = 1000 рядків коду. Якщо перевести один раз весь цикл в байт-код, то аналізувати йому доведеться в 10 разів менше! А це означає, що ваші сценарії виконуватимуться в 10 разів швидше.
Виходить, що PHP є транслюючим інтерпретатором або інтерпретуючим транслятором — як кому більше подобається. Варто відзначити, що PHP версії 3 був «чистим» інтерпретатором, і лише з появою четвертої версії сценарії стали виконуватися значно швидше. П'ята версія, як і четверта, є інтерпретуючим транслятором.
Проте, щоб не робили розробники PHP, двійкові виконувані файли, що відкомпілювалися, працюють значно швидше — в десятки, а може і в сотні разів. Але продуктивність PHP цілком достатня для створення Інтернет-додатків. Зараз поясню чому.
Хай вищезазначений цикл, переписаний на мові С, виконується за 0.1 секунди. На мові PHP він виконуватиметься в 10 разів довше — за 1 секунду. Проте передача даних користувачеві — результатів роботи циклу — триватиме 3 секунди. Отримуємо, відповідно, в сумі 3.1 і 4 секунди. Погодитеся, різниця між 3.1 і 4 секунди незначна — як користувач Інтернету ви навіть її не відчуєте. Навіть якщо у вас швидкий виділений канал, різниця все одно не відчуватиметься — може позначитися навантаження на сервер або інші чинники, навіть не залежні від PHP.
Використання інтерпретатора (а значить і PHP) має свої незаперечні переваги:
Вам не потрібно піклуватися про звільнення виділеної пам'яті, вам не потрібно закривати файл після закінчення роботи з ним — за вас все зробить інтерпретатор, оскільки ваша програма виконується під його пильним контролем.
Вам не потрібно думати про типи змінних, вам також не потрібно оголошувати змінну до його першого використання.
Відладка програми і виявлення помилок істотно спрощуються — інтерпретатор неодмінно повідомить вас, якщо щось пішло не так.
Ви можете написати програму, яка писатиме іншу програму (так, це так), а потім включить код тільки що написаної програми і виконає його. Про цю можливість ми поговоримо окремо, коли наступить час.
Пишемо першу програму (скрипт) на PHP
Згідно традиції, знайомство з будь-якою мовою програмування починається з програми Hello, World! Ця програма нічого особливого не робить, вона тільки виводить на екран напис «HelloWorld!». Ми зараз небагато відступимо від традиції і напишемо програму, яка вітатиметься не зі всім світом (все одно цього ніхто не почує), а тільки з нами. Текст програми приведений в лістингу.
Лістинг. Перша програма (скрипт) на PHP
<?
echo "<html><body><hl>";
echo "Hello $my_name";
echo "</hl></body></html>";
?>
Перш, ніж запустити програму, її потрібно правильно «встановити» на сервері. Для цього збережете сценарій під ім'ям first.php і скопіюйте його в каталог DocumentRoot вашого сервера. Якщо ви працюєте під Linux, таким каталогом буде /var/www/html (у старих версіях — /home/ httpd/html). Якщо ви працюєте під Windows і слідували моїм рекомендаціям , каталогом DocumentRoot буде c:\www\html.
На відміну від звичайних CGI-програм, сценарії PHP є для сервера звичайними документами і їх не потрібно поміщати в каталог cgi-bin. Також не потрібно робити їх виконуваними (у випадку, якщо ви працюєте під Linux).
Виконавши вищезгадані рекомендації по установці, в рядку браузера введіть http://localhost/first.php?my_name=Denis. В результаті у вікні браузера ви побачите Hello, Denis

Якщо тепер сторінку, відображену в браузері, переглянути у вигляді HTML-коду, то можна побачити наступне:
<html><body><hl> Hello, Denis </hl></body></html>
Як бачите РНР-код виконався, підставив потрібне значення змінної $my_name і видав готову HTML-сторінку.
Це ми РНР-сценарій запустили через CGI-інтерфейс. При цьому ми передали змінною $my_name значення Denis. Проте будь-яку РНР-програму можна запустити так: php file.php. При цьому CGI-змінні будуть недоступні — адже ви запустили програму з командного рядка. Демонстраційні РНР-програми, не вимагаючі CGI.
Примітка.
Вводити текст програми краще в текстовому редакторові, що підтримує підсвічування синтаксису PHP. Якщо ви працюєте під Linux, можу порекомендувати трьох редакторів: До Write (команда kwrite), Kate (kate) і Quanta (quanta). Під Windows також не складає труднощів знайти такий редактор (у Інтернеті). Якщо ви не знайдете редактор з підсвічуванням синтаксису PHP, можна використовувати редактор з підсвічуванням синтаксису мови С.
Тепер розглянемо саму програму. Код PHP полягає в спеціальні теги <? і ?>. Після тега початку сценарію (<?) слідує перший оператор — echo. Оператора echo здійснює виведення інформації. Його з повною упевненістю можна назвати найголовнішим оператором — адже без нього було б неможливе виведення інформації в браузер і користувач не побачив би результату роботи сценарію.
Що виводиться оператором echo рядок полягає в лапки. Перший оператор виводить теги HTML, BODY і H1. В принципі, можна було б і не виводити перші два тега, але потрібно звикнути до дисципліни із самого початку.
Другий оператор echo "Hello, Smy_name"; виводить слово Hello і значення змінної $my_name. Щоб якось відрізняти змінні від звичайних рядків, перед ім'ям змінної ставиться знак долара. І це стосується не тільки рядків, у будь-якому випадку перед ім'ям змінної потрібно ставити знак долара. Знаю, що це незвично, але ви досить швидко звикніть до цього. Правда, спочатку ви припускатиметеся багато «грошових» помилок. Привласнення змінній якого-небудь значення здійснюється оператором привласнення, який позначається значком «=» (рівно). Приклади використання змінних:
$i=0; $d=7; $i=5 + $d// $i=12
Ще один приклад:
$wordl = "Hello"; $word2 = "world";
echo "$wordl $word2"; echo "$wordl, word2";
Перший оператор виведе в браузер рядок «Hello, world», а другою — «Hello, word2». В даному прикладі ми визначили дві змінні — $wordl і $word2. Так як ми забули дописати символ долара в другому операторові, PHP сприйняв «word2» як звичайний рядок, а не як змінну.
Зверніть увагу, що в нашому першому прикладі (first.php) ми не оголосили змінну $my_name. Її оголосив автоматично сам PHP — адже це параметр, переданий сценарію браузером. У цьому полягає ще одна перевага PHP перед іншими мовами програмування.
Ви коли-небудь програмували на С або Pascal? Звернення до параметра, переданого програмі, здійснюється по номеру, наприклад, прочитати значення параметра номер 1 можна, викликавши функцію ParamStr(l), а не по імені. Відчуваєте різницю? Тобто, якщо ми програмуємо на Pascal або С, нам обов'язково потрібно знати номер параметра. Наприклад, нам потрібно передати програмі два параметри — файл-джерело і файл-призначення. Програма повинна скопіювати дані з джерела в призначення. Якщо ми переплутаємо порядок файлів, може відбутися непоправне — файл-джерело буде перезаписаний файлом-призначення. У PHP нам немає ніякої різниці, як слідуватимуть параметри:
src=filel&dest=file2 або dest=file2&src=filel
(так передаються браузером параметри нашому сценарію).
Дуже зручно! І це не говорячи вже про те, що PHP сам виконує розбір переданого рядка, оголошує і ініціалізував змінні.
Третій оператор нашої програми особливих коментарів не потребує, як і тег закінчення РНР-програми (?>).
Модифікуємо небагато наш текст програми first.php, щоб він виглядав так:
<?
echo "<html><body><hl>";
echo "Hello $my_name";
echo "<br> $var";
echo "</hl></body></html>";
?>
Якщо ми не передамо програмі параметр $var, тобто, як завжди, запустимо програму тільки з параметром $my_name, то у вікні браузера ми побачимо повідомлення про те, що змінна $var не визначена. Для того, щоб позбавитися від цієї помилки, безпосередньо перед оператором echo "<br> $var"; додайте рядок:
$var=" ";
Змінна буде оголошена і ініціалізувала. У PHP, як і в С++, ви можете оголошувати змінні в будь-якому місці сценарію, але до місця першого використання змінної. Як ви вже знаєте, будь-який інший інтерпретатор, наприклад, Perl, в подібній ситуації згенерував би повідомлення 500: «Помилка сценарію». Інтерпретатор PHP вирішує проблему просто і елегантно, позбавляючи тим самим Web-програміста від проглядання багатотомних журналів Web-сервера.