ІНСТРУКЦІЯ SWITCH-CASE (КОНСТРУКЦІЯ ВИБОРУ)
Нами залишилася непоміченій дуже важлива конструкція — switch-case. Дана конструкція призначена для вибору дій, залежно від значення вказаного виразу. Конструкція switch-case чимось нагадує оператора if-else, який, по суті, є її аналогом. Конструкцію вибору потрібно використовувати, якщо передбачувані варіантів багато, скажімо, більше 5, і для кожного варіанту потрібно виконати специфічні дії. В цьому випадку використовувати оператора вибору if-else просто незручно.
Синтаксис switch-case такий:
,
switch (вираз)
{
case значення1 : команди1; [break;]
case значення2 : команди2; [break;]
[default: команди_по_замовчуванню; [break;]]
}
Альтернативний синтаксис конструкції виглядає так:
switch (вираз):
case значение1: команди1; [break;]
case значение2 : команди2; [break;]
[default: команди_по_замовчуванню; [break;]]
endswitch;

Працює ця конструкція таким чином:
1.Обчислюється значення виразу.
2. Є видимим набір значень. Хай значення1 рівне значенню виразу, обчисленого на першому кроці. Якщо не вказаний оператор break, то будуть виконані команди i, i+1, i+2 ...,N. Інакше (є break) буде виконана тільки команда з номером i.
3. Якщо жодне значення з набору не співпало із значенням виразу, тоді виконується блок default, якщо він вказаний.
Невеликий приклад:
<?
$age=21;
switch ($age)
{
case 20 : echo "Вам двадцять років\n";
case 21 : echo "Вам двадцять один рік\n";
case 22 : echo "Вам двадцять два роки\n";
default: echo "Вам $age років\n";
}
?>
Якщо змінна $age рівна 21, тоді будуть виведені рядки:
Вам двадцять один рік Вам двадцять два роки Вам 21 років
Ясна річ, що нам потрібне, щоб програма вивела тільки один рядок, тому потрібно використовувати операторів break:
<?
$age=21;
switch ($age)
{
case 20 : echo "Вам двадцять hjrsd\n"; break;
case 21 : echo "Вам двадцять один рік\n"; break;
case 22 : echo "Вам двадцять два роки\n"; break;
default: echo "Вам $age років\n"; break;
}
?>
Якщо хтось знає мову Pascal, то в нім була подібна конструкція case, що дозволяє указувати діапазони значень:
case (age)
10..20 : writeln('BAM від 10 до 20 років');
end;
У РНР таку можливість можна реалізувати так (діапазон 20...22):
<?
$age=21; switch ($age)
case 20 : case 21 : case 22 : echo "Вам від 20 до 22\n"; break;
?>
Збираємо один скрипт з декількох окремих скриптів
Інструкції require
Дані інструкції дозволяють зібрати велику програму на декілька окремих файлів. Інструкція require дозволяє включити код до виконання нашого сценарію.
Загальний синтаксис інструкції такий:
require имя_файла;
Тепер розберемося докладніше, що ж робить require. Інтерпретатор аналізує сценарій і, знайшовши require, просто замінює її вмістом вказаного файлу. Це може бути HTML-файл або сценарій на PHP. B останньому випадку вміст файлу повинен бути обрамлений тегами <? і ?> — як у випадку із звичайним сценарієм. Вставка вмісту файлу, відбувається ДО виконання сценарію — прочитавши наступний пункт, ви відмітите різницю.
Дуже зручно використовувати цю інструкцію для включення HTML-заголовків. Наприклад:
Файл header.html:
<html><head>
<title>My Company's Official Web Page</title> </head> <body>
Сценарій:
require header.html /* тіло документа */
Інструкції include
На відміну від require директива include дозволяє включити код в сценарій під час виконання сценарію. Використання цієї директиви виглядає таким чином:
include ім'я файлу;
Можливо, вам потрібно динамічно міняти заголовок залежно від ситуації:
for ($i=0; $i<4; $i++) {
inlcude "header{$i}.html"
};
Створіть 4 файли: header0.html, headerl.html, header2.html і header3.html. Хай кожний з них містить відповідну імені файлу цифру — від 0 до 3. При виконанні сценарію ви побачите висновок 0123. Даний висновок означає, що вміст файлів вставляється в сценарій під час його виконання. Заміните include на require, і ви відчуєте різницю.
Звернете увагу на фігурні дужки. При такому контексті використання include вони обов'язкові. Чому? Інтерпретатор просто замінює include вмістом файлу. Уявіть, що наш файл містить не один, а декілька операторів. Вийде наступне:
for ($i=0; $i<4; $i++) operatorl; operator2; operator3;
Як ви бачите, ми отримуємо зовсім не те, на що розраховували. Ми хотіли, щоб всі три оператори виконалися чотири рази, а насправді, чотири рази виконується тільки перший оператор, а інші два будуть виконані після закінчення роботи циклу. Звідси слідує невеликий висновок: якщо ви забудете укласти include у фігурні дужки (у циклі), то ваша програма працюватиме некоректно або взагалі виникне помилка. Завжди беріть інструкцію include у фігурних дужок!
Особливості використання include і require
Що ж відбувається насправді при використанні include? Ми знаємо, що РНР перетворить наш сценарій у власне внутрішнє уявлення. Перший рядок, другий, третій... І так, поки він не дійде до інструкції include. Потім РНР припиняє транслювати наш сценарій і перемикається на вказаний в include файл. Цілком з'ясовно: інтерпретатор не знає, що буде в цьому файлі, тому не може відкласти його трансляцію «до кращих часів». Якщо у вас велика програма, і вона підключає додаткові файли за допомогою include, навряд чи вона працюватиме швидко, оскільки із-за особливостей include швидкодія різко знижується.
З require таких проблем немає: файл включається до виконання сценарію, тобто на момент трансляції він вже включений в наш сценарій і РНР немає необхідності чекати, поки відтранслюється вказаний файл.
Що ж використовувати? Якщо вам потрібно підключити якийсь додатковий модуль (наприклад, клас HtmlMimeMail, який розглядатиметься в цій книзі), використовуйте require. Якщо ви точно знаєте, що вам потрібно включити якийсь файл не один раз, використовуйте include, проте прагніть по можливості використовувати require скрізь, де тільки можна.
Інструкції одноразового включення include_once і require_once
Ваша програма розрослася до такого ступеня, що ви не можете пригадати, який файл ви включали, а який — ні? Такого бути не може! Невже не видно, що і де включається?
Така ситуація зустрічається досить часто при розробці дійсно великих сценаріїв. Припустимо, що у нас є сценарій main.php, у який включені файли header.php, code.php, footer.php. У файл code.php теж включається декілька файлів. У одному з цих файлів знаходиться інструкція:
require "header.php";
Виходить, що файл header.php включений двічі. Що ж буває — ви забули або хтось з ваших колег навіть не підозрював, що файл header.php вже включений. Таке включення може стати причиною серйозної помилки, яку дуже важко знайти.
Розробники PHP передбачили вихід з цієї ситуації. Використовуючи інструкції одноразового включення include_once і require_once, ви можете бути упевнені: жоден файл не буде включений двічі. Працюють ці інструкції точно так, як і include і require, але з однією відмінністю: перед включенням файлу інтерпретатор перевіряє, чи включався цей файл чи ні. Якщо так, то файл не буде включений до складу сценарію. Звичайно, використання цих інструкцій вимагає додаткових зусиль від вашого інтерпретатора, оскільки він повинен пам'ятати імена всіх включених файлів, але це краще, ніж пам'ятати їх самому.