Лекція №8, Настроювання та використання серверних скриптів
Код роботи: 3748
Вид роботи: Лекція
Предмет: Web-програмування
Тема: №8, Настроювання та використання серверних скриптів
Кількість сторінок: 29
Дата виконання: 2015
Мова написання: українська
Ціна: безкоштовно
1. Огляд мов серверних скриптів
2. Структура мови РНР
1. Огляд мов серверних скриптів
Для того, щоб проста HTML-сторінка ожила, існує кілька технологій. Перший поділ пов'язаний з місцем здійснення цих дій: на сервері або на клієнті. Далі розподіл ведеться по методу програмування: з використанням інтерпритуємих скріптів або відкомпільованих програм. Вищевикладене можна представити у вигляді наступної таблиці:
Сторона клієнта |
Сторона сервера |
||
Скріпти |
Програми |
Скріпти |
Програми |
|
Серверні скріпти належать до серверної частини, але стоять особняком, тому що сполучають у собі властивості як скріптових мов, так і програм.
Мови серверних скриптів
У даній частині ми розглянемо більш докладно найбільш популярні технології серверних скриптів:
- PHP
- Perl,embPerl, Mod_perl
- ColdFusion
- ASP
- Java Server Pages
- WebSQL
• PHP
Головний Web-вузол: http://www.php.net Платформи: Win32, Linux Механізм: окрема CGI-програма, модуль Web-сервера Web-сервера: IIS, Apache Розширення файлів: php, php3, phtml
Досить популярна технологія багато в чому завдяки своїй безкоштовності. Мова скриптів нагадує своїм синтаксисом мову C. Є безліч додаткових бібліотек для роботи з різними базами даних, з документами PDF, з GIF-файлами. Часто PHP поєднується в одне з такою же безкоштовною базою даних як MySQL. Існує безліч провайдерів, що надають хостинг зі зв'язкою Apache/PHP/MySQL. у цей час розроблювачі PHP стверджують, що ця мова використається на 1.000.000 вузлах.
* * *
• embPerl
Головний Web-вузол: http://perl.apache.org/embperl/ Платформи: Linux, Win32 Механізм: окрема CGI-програма, модуль Web-сервера Web-сервера: IIS, Apache
В HTML-сторінки уставляються скріпти на вже знайомій вам мові Perl. Це значить, що для використання вам не доведеться як у випадку з ColdFusion або PHP вивчати нову мову. Технологія безкоштовна. Має зв'язки з популярними базами даних.
* * *
• mod_perl
Головний Web-вузол: http://perl.apache.org/ Платформи: Linux, Win32 Механізм: модуль Web-сервера Web-сервера: Apache
Ідея та ж, що й в embPerl, тільки в цьому випадку інтерпретатор Perl-а "зашивається" у середину Web-сервера Apache. Це природно підвищує швидкість роботи. Технологія безкоштовна.
* * *
• ColdFusion
Головний Web-вузол: http://www.allaire.com/Products/Coldfusion/ Розроблювач: Allaire, Inc. Платформи: Win32, Linux (починаючи з версії 4.5) Механізм: окрема CGI-програма Web-сервера: IIS, PWS Розширення файлів: cfm
Технологія є комерційною. Є свій власний засіб розробки сторінок з убудованими скріптами мовою ColdFusion - ColdFusion Studio - клон HomeSite. На платформі Win32 зв'язується з базами даних стандартними засобами Windows через ODBC.
* * *
• ASP
Головний Web-вузол: http://www.microsoft.com Розроблювач: Microsoft Платформи: Win32 Механізм: убудований модуль для Web-сервера Web-сервера: IIS Розширення файлів: asp
Потужна технологія, яку просуває посилено Microsoft. Шкода тільки, що працює вона на повну силу тільки на продуктах того ж Microsoft. Синтаксис скріптів нагадує VBScript/VBA. Інтеграція з операційною системою набагато більш тісна, чим в інших технологіях, що дозволяє витворяти на ASP такі речі, які, мабуть, неможливі за допомогою інших мов. Підтримує роботу з базами даних.
* * *
• JSP (Java Server Pages)
Головний Web-вузол: http://java.sun.com/products/jsp/ Розроблювач: Sun Розширення файлів: jsp
[опис буде пізніше]
Існує проект по створенню безкоштовного варіанта JSP - GNUJSP.
* * *
• WebSQL
2. Структура мови РНР
Програми PHP можуть виконуватися двома способами: як сценарний додаток Web-сервером і як консольні програми. Оскільки, нашим завданням є програмування web-додатків, ми переважно розглядатимемо перший спосіб.
Річ у тому, що на PHP, як правило, використовується суто для програмування додатків, пов'язаних з Інтернетом. Проте, PHP можна ще використовувати як інтерпретатор командного рядка, в основному в *nix-системах. Останнє можливо за допомогою CORBA і COM інтерфейсів, а також за допомогою розширення PHP-GTK. При такому використанні PHP можливо рішення наступних задач:
- створення додатків інтерактивного командного рядка;
- створення крос-платформенних GUI додатків за допомогою бібліотеки PHP-GTK;
- автоматизація деяких завдань під Windows і Linux
Розглянемо процес виконання php-сценарію при зверненні браузера до сервера. Отже, спочатку браузер запрошує сторінку з розширенням.php, після чого web-сервер пропускає програму через машину PHP і видає результат у вигляді html-коду. Причому, якщо узяти стандартну сторінку HTML, зрадити розширення.php і пропустити її через машину PHP, остання просто перешле її користувачу без змін. Щоб включити в цей файл команди PHP, необхідно укласти команди PHP в спеціальні теги, яких розрізняють 4 види (вони еквівалентні і можна використовувати будь-які при ввімкнених відповідних опціях в рhр.):
1. Інструкція обробки XML:
...
2. Інструкція обробки SGML:
<?
...
3. Інструкція обробки сценаріїв HTML:
<script language = "php">
...
</script>
4. Інструкція в стилі ASP:
<%
...
%>
Ми дотримуватимемося стилю XML або SGML.
Взагалі кажучи, усередині якого-небудь блоку коду можна вийти з PHP, за умови, що далі ми увійдемо до нього знову і закінчимо код. Тобто, можлива наступна конструкція:
<?
if(5<3){
echo("<p>Hello, world!<p>");
<p>Hello!</p>
// цей рядок не інтерпретується як код PHP
// і виводиться тільки якщо блок коду виконується
<?
echo("<p>Hello, world!<p>");
}
Команда echo в PHP застосовується для виводу фактично всього, що зустрічається на web-сторінках (текст, розмітку HTML, числа). Сенс її дії, ми думаємо, зрозумілий з приведеного прикладу
Коментарі
PHP надає декілька методів для вставки коментарів. Простіше всього користуватися подвійним слешем (//), після чого PHP машина ігнорує все, що розташовано до кінця рядка. Також можна користуватися багаторядковими коментарями в стилі С (/*.*/). Для однорядкових коментарів можна ще користуватися символом грат (#) (коментар скриптових мов UNIX).
<php
echo("<p>Hello</p>"); // коментар
echo("<p>Hello</p>"); # коментар
/*
і це теж коментарі
*/
Слід пам'ятати про те, що стилі коментарів PHP діють тільки усередині обмежувачів PHP. Якщо PHP зустріне ці символи коментарів поза обмежувачами, то вони, як і будь-який текст, будуть поміщені на html-сторінку. Наприклад:
<php
echo("<p>Hello</p>"); // нормальний коментар
// а ось цей коментар відобразитися brouzerom.
<!-- Коментар HTML.
Буде видно в початковому коді HTML, але не в Brauzere -->
Відмітимо, що коментарі можна вставляти не тільки після кінця оператора, а, наприклад, і ось так:
<?
$a = "Hello, world";
echo strstr($a,"H");
// цю функцію ми розглянемо пізніше
Змінні.
У РНР змінні починаються із знаку долара ($). За цим знаком може слідувати будь-яка кількість буквено-цифрових символів і символів підкреслення, але перший символ не може бути цифрою або підкресленням. Слід також пам'ятати, що імена змінних в РНР чутливі до регістра, на відміну від ключових слів.
При оголошенні змінних в РНР не потрібно явно указувати тип змінної, при цьому одна і та ж змінна може мати впродовж програми різні типи.
Змінна ініціалізувалася у момент привласнення їй значення і існує до тих пір, поки виконується програма. Тобто, у разі web-сторінки це означає, що до тих пір, поки не завершений запит.
Зовнішні змінні
Після того, як запит клієнта проаналізований web-сервером і переданий РНР машині, остання встановлює ряд змінних, які містять дані, що відносяться до запиту і доступні весь час його виконання. Спочатку РНР бере змінні оточення Вашої системи і створює змінні з тими ж іменами і значеннями в оточенні сценарію РНР для того, щоб сценаріям, розташованим на сервері були доступні особливості системи клієнта. Ці змінні поміщаються в асоціативний масив $HTTP_ENV_VARS.
Природно, що змінні масиву $HTTP_ENV_VARS є системно залежними (оскільки це фактично змінні оточення). Подивитися значення змінних оточення для Вашої машини Ви можете за допомогою команди env (Unix) або set (Windows).
Потім РНР створює групу GET-змінних, які створюються при аналізі рядка запиту. Рядок запиту зберігається в змінній $QUERY_STRING і є інформацією, наступною за символом "?" у запитаному URL. РНР розбиває рядок запиту по символах & на окремі елементи, а потім шукає в кожному з цих елементів знак "=". Якщо знак "=" знайдений, то створюється змінна з ім'ям з символів, що стоять зліва від знаку рівності. Розглянемо наступну форму:
<form action = "http://localhost/PHP/test.php" method="get">
HDD: <input type="text" name="HDD"/><br>
CDROM: <input type="text" name="CDROM"/><br>
<input type="submit"/>
Якщо Ви в цій формі в рядку HDD наберете, наприклад, "Maxtor", а в рядку CDROM "Nec", то вона згенерує наступну форму запиту:
http://localhost/PHP/test.php?HDD=Maxtor&CDROM=Nec
У нашому випадку РНР створить наступні змінні: $HDD = "Maxtor" і $CDROM = "Nec".
Ви можете працювати з цими змінними з Вашого скрипта (у нас - test.php) як із звичайними змінними. У нашому випадку вони просто виводяться на екран:
<?
echo("<p>HDD is $HDD</p>");
echo("<p>CDROM is $CDROM</p>");
Якщо запит сторінки виконується за допомогою методу POST, то з'являється група POST-змінних, які інтерпретуються також і поміщаються в масив $HTTP_POST_VARS.
Константи
Константи оголошуються в РНР за допомогою функції define():
define(CONSTANT, value)
Перший параметр цієї функції - ім'я константи, другої - її значення. При використанні константи на неї посилаються по імені:
<?
define(CONSTANT1,15);
define(CONSTANT2,"x20"); // код пропуску
define(CONSTANT3,"Hello");
echo(CONSTANT1);
echo(CONSTANT2);
echo(CONSTANT3);
За традицією імена констант пишуть буквами верхнього регістра. І хоча це тільки традиція, ми Вам рекомендуємо їй слідувати, оскільки погані програмісти виходять у тому числі і з тих, хто не слідував хорошим традиціям. Існує функція defined(), яка перевіряє, чи визначена константа:
<?
define(CONSTANT,"Hello");
if(defined("CONSTANT"))
{
echo("<p>CONSTANT is defined</p>");
}
Типи даних в РНР. Перетворення типів
Як вже було сказано, PHP надає певну гнучкість відносно типів змінних, тобто з однією і тією ж змінною впродовж програми можна працювати і як з рядком, і як з числом. Проте, не дивлячись на це в РНР існують набір основних типів даних, які можуть явно указуватися при роботі із змінними:
· integer;
· string;
· boolean;
· double;
· array;
· object;
Є функція gettype(), що повертає тип, який РНР призначив змінною:
<?
$var = "5";
$var1 = 5;
echo(gettype($var));
echo "<br>";
echo(gettype($var1));
Подивитись
У першому випадку РНР поверне string, в другому integer.
Існує також функція settype(), яка явно встановлює тип:
<?
$var = "5";
echo(gettype($var));
settype($var,integer);
echo "<br>";
echo(gettype($var));
Подивитись
Виконання цього фрагмента коду приведе до такого ж результату, як і попереднього.
Окрім функції settype() перетворення типів в РНР можна здійснювати за допомогою операторів перетворення типів. Перетворення типів здійснюється шляхом вказівки перед змінною її нового типа, узятого в дужки:
$var = (int)$var;
Відповідно, виконання наступного коду приведе до того, що РНР поверне integer:
<?
$var = "5"; // тип string
$var = (int)$var; // перетворюваний в int
echo(gettype($var));
Оператори
Арифметичні оператори
+ Складання
- Віднімання
* Множення
/ Ділення
%О бчислення залишку по модулю (наприклад: 5 % 2=1)
Порозрядні оператори
Ця група операторів працює з бітовими представленнями значень цілочисельних операндів. В основному ці оператори застосовуються для створення набору булевих прапорів. У наших вправах ми використовуватимемо цих операторів дуже рідко, проте про всяк випадок нижче приведений приклад з використанням цих операторів.
& Порозрядна кон'юнкція (AND)
| Порозрядна диз'юнкція (OR)
^ Порозрядне виключення АБО (XOR)
~ Порозрядне заперечення (NOT)
<< Зсув вліво бітового представлення значення лівого цілочисельного операнда на кількість розрядів, рівну значенню правого цілочисельного операнда
>> Зсув управо бітового представлення значення лівого цілочисельного операнда на кількість розрядів, рівну значенню правого цілочисельного операнда
Приклад:
<?
echo(4<<2); // рівне 16
echo"<br>";
echo(5>>1); // рівне 2
echo"<br>";
echo(6&5); // рівне 4
echo"<br>";
echo(6|5); // рівне 7
echo"<br>";
echo(6^5); // рівне 3
>?
Розберемо перший приклад. Двійковий код для 4 рівний 100, при зсуві вліво на 2 розряди код 100 стає рівним 10000, що відповідає десятковому значенню 16. Решта прикладів може бути розібрана аналогічно. Звернемо увагу на те, що зсув вліво на n позицій еквівалентне множенню на 2n, а зрушення управо зменшує відповідне значення в 2n разу з відкиданням дробової частини результату (тому 5>>1 рівне 2). Основне призначення цих операторів - швидкі обчислення. Оскільки їх підтримка здійснюється на апаратному рівні (процесор), алгоритми, виконані з використанням даних операторів виходять дуже продуктивними.
Логічні оператори
or або || АБО
Xor виключаюче АБО
and або && І
! НЕ
Оператори цієї групи, на відміну від порозрядних, працюють з логічними змінними (boolean) і інтенсивно використовуються в конструкціях, що управляють: цикли і умови. Логічні змінні, або правильніше, змінні типу Boolean мають лише два значення: true(істина) і false(брехня). У виразах true і false можна замінити на 1(будь-яке відмінне 0 число) і 0, відповідно. Можливість заміни true і false на 1 і 0 - це «спадок» мови С, в якому не було спеціальних змінних true і false.
Логічно оператори для змінних типу Boolean виконують роль операторів складання, віднімання для звичайних змінних. Розглянемо декілька прикладів, якщо їх сенс Вам не дуже зрозумілий - не турбуйтеся, просто поверніться сюди, прочитавши наступні розділи. Оператор if(cond) перевіряє умову cond, якщо його значення true - виконується код у фігурних дужках, наступний за if, якщо false - код після оператора else. Якщо cond рівний false - все навпаки.
<php
$flag = true; // Істина
if($flag)
{
echo "<p>Змінна flag має значення true</p>";
} else {
echo "<p>Змінна flag має значення false</p>";
}
Результати роботи скрипта виглядають таким чином:
Змінна flag має значення true
Якщо тепер замінити строчку
$flag = true; // Істина
на
$flag = false; // Брехня
Результат, що видається тегом змінитися:
Змінна flag має значення false
Тобто ми зайшли в блок else, оскільки в операторі if умова помилково.
Коли умова одне, як бачите, все просто. Коли умов більше - в справу вступають логічні оператори:
<php
$flag1 = true; // Істина
$flag2 = true; // Істина
if($flag1 && $flag2) // І $flag1 І $flag2 істини
{
echo "<p>Умова: true (Обидва прапори істини)</p>";
// Так
} else {
echo "<p>Умова: false (Один з прапорів помилковий)</p>";
// Ні, один або обидва помилкові
}
Цей скрипт виведе: Умова: true (Обидва прапори істини). Якщо хоч би один з операторів виявиться рівним false (або обидва відразу) - буде виведено: Умова: false (Один з прапорів помилковий).
Обов'язково спробуйте пограти з умовами: якщо ви не розбиратиметеся в умовних операторах - Ви ніколи не будете хорошим програмістом ні на одній мові програмування. Якщо Ви вважаєте, що Вам не потрібні умовні оператори - Вам не потрібна мова програмування.
Замінимо && (И) на || (АБО)
<php
$flag1 = true; // Істина
$flag2 = false; // Істина
if($flag1 || $flag2)
// Хоч хтось з двох прапорів($flag1 $flag2) істинний
{
echo "<p>Умова: true (Один з прапорів істин)</p>";
// Так
} else {
echo "<p>Умова: false (Обидва прапори помилкові)</p>";
// Немає обидва мають значення false
}
Знову одержуємо: Умова: true.
Для І і АБО, як бачимо, можливі два варіанти операторів, причому ці оператори з різними пріоритетами. Пріоритетність виконання логічних операторів: or > xor > and > || > && > ! Іноді в умовах зручно використовувати дужки для явного завдання приорітету:
<php
$flag1 = true;
$flag2 = true;
$flag3 = false;
if( $flag1 && $flag2 || $flag3)
{
echo "<p>Умова істинна<p>";
}
else
{
echo "<p>Умова не правдива<p>";
}
Результатом буде виведення фрази «Умова істинно», оскільки згідно пріоритету виконання спочатку виконується оператор &&, оскільки обидва прапори рівні true - повертається true, потім цей вираз порівнюється з $flag3 (true || $flag3) - що повертає теж true, оскільки одне з порівнюваних рівне true.
Якщо ж ми запишемо
<php
$flag1 = true;
$flag2 = true;
$flag3 = false;
if($flag1 && ($flag2 || $flag3))
{
echo "<p>Умова істинна<p>";
}
else
{
echo "<p>Умова фальшива<p>";
}
результатом буде «Умова помилкова».
Взагалі програмісти не люблять запам'ятовувати порядок пріоритетів, тому для того, щоб Ваш код легко читався (у тому числі і Вами) краще завжди використовувати дужки. Тобто в першому скрипті краще записати if(($flag1 && $flag2) || $flag3) - тоді відразу стане зрозуміло, що є за чим.
Іноді потрібно перевірити умову безальтернативно, наприклад, на помилковість або істинність. Припустимо, функція (func()) повертає істину або брехню і залежно від цього потрібно вивести на сторіночку той або інший Teг. Наприклад, функція mysql_query($query) - повертає true якщо запит до бази даних mySQL, розміщений в рядку $query успішно виконався і false - інакше.
Якщо Вам потрібно зреагувати тільки на вдале звернення, Ви можете записати:
<php
if(mysql_query($query))
{
echo "<p>Данные успішно занесені в базу даних.<p>";
}
Якщо Вам потрібно зреагувати тільки на не вдалі звернення, Ви, звичайно, можете записати:
<php
if(mysql_query($query))
{
else
{
echo"<p>Данные не були занесені в базу даних.<p>";
}
Але це не елегантний, заплутуючий спосіб - тут самий час скористатися оператором заперечення: !, застосування якого до змінної міняє її значення з true на false, а false на true:
<php
if(!mysql_query($query))
{
echo"<p>Данные не були занесені в базу даних.<p>";
}
Оператори вибора/ if...else
До операторів вибору відносять: умовний оператор (if...else) і перемикач (switch). Синтаксис умовного оператора: if(condition) statement 1 else statement 2
Умова condition може бути будь-яким виразом. Якщо воно істинно, то виконується оператор statement 1. Інакше виконується оператор statement 2. Допустима скорочена форма запису умовного оператора, в якому відсутні else і оператор statement 2.
У свою чергу, оператори statement 1 і statement 2 можуть бути умовними, що дозволяє організовувати ланцюжки перевірок будь-якої глибини вкладеності. І в цих ланцюжках кожен умовний оператор може бути як повним, так і скороченим. У зв'язку з цим можливі помилки неоднозначного зіставлення if і else.
Синтаксис мови припускає, що при вкладених умовних операторах кожне else відповідає найближчому if. Як такий помилковий приклад можна привести наступну конструкцію [Подбельській в.в. Мова С++. М.:Финансы і статистика, 2001]:
<?
$x = 1;
$y = 1;
if($x == 1)
if($y == 1)echo("x=1 and y=1");
else echo("x!=1");
При х рівному 1 і у рівному 1 абсолютно справедливе друкується фраза «х = 1 and у = 1». Проте фраза «х != 1» може бути надрукована при х рівному 1 і при у не рівному 1, оскільки else відповідає найближчому if. Зовнішній умовний оператор, де перевіряється $x == 1, є скороченим і як statement 1 включає повного умовного оператора, де перевіряється умова $у == 1. Тобто перевірка цієї умови виконується тільки при х рівному 1. Простим правильним рішенням цієї задачі є застосування фігурних дужок, тобто побудова складеного оператора, тобто нам потрібне фігурними дужками обмежити область дії внутрішнього умовного оператора, зробивши його неповним. Тим самим зовнішній оператор перетворюється на повний умовний:
<?
$x = 1;
$y = 1;
if($x==1)
{
if($y==1)echo("x=1 and y=1");
}
else echo("x!=1");
Відмітимо, що перевірка додаткових умов можлива за допомогою оператора elseif. Оператор if може включати скільки завгодно блоків elseif, але else в кожному if може бути тільки один. Як правило, в конструкціях if.elseif.else оператор else визначає, що потрібно робити, якщо ніякі інші умови не є true. Проте, взагалі кажучи, використання оператора elseif досить сильно погіршує читабельність коду, і краще в цьому випадку користуватися перемикачем (switch).
РНР надає також можливість альтернативного синтаксису умовного оператора - без фігурних дужок, а із застосуванням оператора endif. У наступному прикладі перша таблиця поміщається на сторінку, якщо тільки $HDD рівне «Maxtor», а друга - якщо «Seagate». Наявність оператора endif в цьому випадку обов'язково, оскільки фігурна дужка, що позначає кінець блоку if, відсутня:
<?
if($HDD == «Maxtor»):
<table>
<caption> Maxtor </caption>
</table>
<?
elseif($HDD == «Seagate»):
<table>
<caption> Seagate </caption>
</table>
<?
endif;
Результат виконання скрипта:
Форма запиту
Результат виконання скрипта
Значення змінної $HDD передається формою test.html скрипту test.php. Код форми test.html:
<form action = "http://localhost/PHP/test.php;" method="get">
HDD: <input type="text" name="HDD"/><br>
<input type="submit"/>
</form>
РНР також, як і С++, Java надає можливість замінювати блоки if.else умовною операцією (на відміну від унарних і бінарних операцій умовна операція використовується з трьома операндами). У зображенні умовної операції присутні два розміщених не підряд символу ‘?’ і ‘:’ і три операнди виразу:
вираз_1 ? вираз_2: вираз_3
Першим обчислюється значення вираз_1. Якщо воно істинно (тобто не рівно нулю), то обчислюється значення вираз_2, яке і стає результатом. Якщо при обчисленні значення вираз_1 вийде нуль (брехня), то як результат береться вираз_3. Класичним прикладом умовної операції є вираз
x < 0 ? -х: x;
Цей вираз повертає абсолютне значення зміною x. Тобто, наприклад, код
<?
if($HDD == "Maxtor")
{
$CDROM = "Teac";
}
else
{
$CDROM = "Nec";
}
можна, використовуючи умовну операцію, замінити таким:
<?
$CDROM = ($HDD == "Maxtor") ? "Teac": "Nec";
Проте якщо Ви не хочете комусь глибоко і надовго запудрити мізки, зловживати такими записами навряд чи стоїть, оскільки код стає, м'яко кажучи, нечитабельним. І взагалі, чим простіше - тим краще.
Оператори выбора/ Перемикач switch
Перемикач switch є найбільш зручним засобом для організації мультирозгалужень. Синтаксис перемикача такий:
switch(expression) // перемикальний вираз
{
case value1: // константний вираз 1
statements; // блок операторів
break;
case value2: // константний вираз 2
statements;
break;
default:
statements;
}
Структура switch, що управляє, передає управління тому з помічених case операторів, для якого значення константного виразу співпадає із значенням перемикального виразу. Якщо значення перемикального виразу не співпадає ні з одним з константних виразів, то виконується перехід до оператора, поміченого міткою default. У кожному перемикачі може бути не більше однієї мітки default, проте вона може бути відсутньою взагалі. Приведемо приклад програми з перемикачем. У цій програмі виводяться назви непарних цілих десяткових цифр від 1 до 9 за не менше задану, залежно від числа, вказаного у формі test.html. Форма test.html не відрізняється від тієї, що ми вже використовували:
<form action = "http://localhost/PHP/chapt2/switch.php" method="get">
number: <input type="text" name="number"/><br>
<input type="submit"/>
</form>
<?
switch($number)
{
case 1:
echo ("one ");
case 2: case 3:
echo ("free");
case 4: case 5:
echo ("five");
case 6: case 7:
echo ("seven");
case 8: case 9:
echo ("nine");
break;
default:
echo ("This isn't number or number is > 9 or < 1");
}
Результат виконання скрипта:
Форма запиту
Результат виконання скрипта
Так само, як і у разі умовного оператора для перемикачів допустимі будь-які ступені вкладеності, проте зловживати цим персоною на те необхідності також не слід.
Окрім вже сказаного про перемикач, приведена програма демонструє дію оператора break, за допомогою якого відбувається вихід з перемикача. Якщо помістити операторів break після виведення кожної з цифр, то у вікні браузера ми побачимо назву тільки однієї непарної цифри.
Як бачимо, після конструкції switch приведений складений оператор, проте це абсолютно не обов'язково - після switch може знаходитися будь-який оператор, помічений службовим словом case.
Нагадаємо, що складений оператор, це увязнена у фігурні дужки послідовність операторів.
Відмітимо також, що в PHP як мітки case можуть використовуватися не тільки літерали, але і самі мітки можуть бути змінними. Як мітки case в PHP не можуть виступати тільки масиви і об'єкти.
Оператори циклу
Оператори циклу задають багатократне виконання операторів в тілі циклу. У PHP визначені 4 різних оператора циклу:
· цикл з передумовою:
· while(condition)
· {
· statements;
· }
· цикл з умовою поста:
· do
· {
· statements;
· } while(condition);
· ітераційний цикл:
· for(expression1;expression2;expression3)
· {
· statements;
· }
· ітераційний цикл foreach:
· foreach (array as [$key =>] $value)
· {
· statements;
· }
Якщо 3 перших оператора циклу беруть свій початок від С-подобних мов, то останній оператор pozaymstvovan у мови Perl (до речі, цикл foreach ми розберемо пізніше - у розділі 4, присвяченої масивам).
Оператори цикла/ While
Оператор while називається оператором циклу з передумовою. При вході в цикл обчислюється вираз умова, і, якщо його значення відмінно від нуля, виконується тіло циклу. Потім обчислення виразу умови і операторів тіла циклу виконується до тих пір, поки значення виразу умови не стане рівним нулю. Оператором while зручно користуватися для проглядання всіляких послідовностей, якщо в кінці їх знаходиться наперед відомий символ. (Це дуже зручно в C++, наприклад для визначення довжини рядка, оскільки в С++, за визначенням, рядок є послідовність символів типу char, що закінчується нульовим символом).
Приклад простого циклу while:
<?
$var = 5;
$i = 0;
while(++$i <= $var)
{
echo($i); echo('<br>');
}
Цей код видає у вікні браузера цифри від одного п'яти:
1 2 3 4 5
Для виходу з циклу застосовується оператор break. При виявленні цього оператора поточна ітерація циклу припиняється, і подальші ітерації не відбуваються. При виконанні наступного прикладі, не дивлячись на те, що змінна $var = 7, у вікні браузера з'являться цифри від 1 до 5.
<?
$var = 7;
$i = 0;
while(++$i <= $var)
{
echo($i);
echo('<br>');
if($i==3)break;
}
Іноді буває потрібно перервати тільки поточну ітерацію, і перейти відразу до наступної. Для цього застосовується оператор continue:
<?
$var = 7;
$i = 0;
while(++$i <= $var)
{
if($i==5)
{
continue;
}
echo($i);
echo('<br>');
}
В даному прикладі виводяться цифри від 1 до 7, окрім цифри 5:
1 2 3 4 6 7
Відмітимо, що якщо Ви умовного оператора поставите після операторів echo, код буде помилковим, і виведуться всі цифри від 1 до 20, оскільки перевірка умови виходу з циклу на даній ітерації, відбуватиметься вже після виконання цієї ітерації.
Нескінченний цикл реалізується за допомогою оператора while таким чином:
while(1)
{
...
}
Це теж саме, що і запис while(true).
Оператори цикла/ Do.while
Цей оператор називається оператором циклу з умовою поста. При вході в цикл у будь-якому випадку виконується тіло циклу (тобто цикл завжди буде виконаний хоч би один раз), потім обчислюється умова, і якщо воно не рівне 0, знов виконується тіло циклу. У нижченаведеному прикладі нуль завжди буде доданий в список, незалежно від умови (++$i <= $var):
<?
$var = 5;
$i = 0;
do
{
echo($i); echo('<br>');
}
while(++$i <= $var)
Результат:
1 2 3 4 5
Цикл з умовою поста корисний при обробці деяких послідовностей, коли обробку потрібно закінчувати не до, а після появи кінцевої ознаки.
Нескінченний цикл реалізується так:
do; while(1);
Оператори цикла/ For
Як вже мовилося, ітераційний цикл має наступний формат:
for(expression1;expression2;expression3)
{
statements;
}
Тут expression1 (ініціалізація циклу) - послідовність визначень і виразів, що розділяється комами. Всі вирази, що входять в ініціалізацію, обчислюються тільки один раз при вході в цикл. Як правило, тут встановлюються початкові значення лічильників і параметрів циклу. Сенс виразу-умови (expression2) такої ж як і у циклів з pred- і умовами поста. За відсутності виразу-умови передбачається, що його значення завжди істинне. Вирази expression3 обчислюються в кінці кожної ітерації після виконання тіла циклу.
У наступному скрипті, ми за традицією виведемо числа від 0 до 5:
<?
$var = 5;
$i = 0;
for ($i = 0; $i <= $var; $i++)
{
echo($i);
echo('<br>');
}
Результат аналогічний, показаному на попередньому малюнку.
Нескінченний цикл можна організувати таким чином:
for(;;);
або
for(;1;);
Строкові функції PHP
Не дивлячись на те, що цей розділ написаний швидше у дусі довідника, матеріал, викладений в ній, достатньо серйозний, хоч і не найскладніший для розуміння. Уміння грамотно працювати з рядками дуже важливо для програміста. Строкових функцій в PHP немало, причому багато хто з них, так або інакше, просто дублює один одного. Проте, прийоми роботи з основними блоками функцій (функції пошуку і заміни в тексті, функції видалення пробільних символом (trim-функції), функції висновку, формату) треба представляти дуже чітко.
Взагалі кажучи, за визначенням, рядок - це послідовність символів типу char, яка закінчується нульовим символом. Тому, можна, звичайно, радіти тому, що при роботі з рядками, нам не доводиться жонглювати покажчиками в стилі C/C++, проте не варто забувати про те, що ціна цій зручності - швидкодія. Тому деякі функції, що приводяться тут, ми обговорюватимемо у тому числі і з погляду їх швидкодії