Материал: Лекція 3

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

3 Оператори передачі управління

Іноді вимагається негайно завершити роботу циклу або окремої його ітерації. Для цього використовують оператори break і continue .

break

Оператор break закінчує виконання поточного циклу, будь то for, foreach, while, do..while або switch. break може використовуватися з числовим аргументом, який говорить, роботу скількох управляючих структур, що містять його, потрібно завершити.

<?php

$i=1;

while ($i) {

$n = rand(1,10);

// генеруємо довільне число від 1 до 10

echo "$i:$n ";

// виводимо номер ітерації і число, що згенерувало

if ($n==5) break;

/* Якщо згенерувало число 5 то припиняємо роботу циклу. В цьому випадку все, що знаходиться після цієї строчки усередині циклу, не буде виконано */

echo "Цикл працює <br>";

$i++;

}

echo "<br>Число ітерацій циклу $i ";

?>

Приклад 3.8. Оператор break

Результатом роботи цього скрипта буде зразкове наступне:

1:7 Цикл працює

2:2 Цикл працює

3:5

Число ітерацій циклу 3

Якщо після оператора break вказати число, то урветься саме така кількість циклів, що містять цей оператор. В приведеному вище прикладі це неактуально, оскільки вкладених циклів немає. Трохи змінимо наш скрипт:

<?php

$i=1;

while ($i) {

$n = rand(1,10);

// генеруємо довільне число від 1 до 10

switch ($n){

case 5: echo "<font color=blue>

Вихід з switch (n=$n) </font>";

break 1;

//припиняємо роботу switch (першого break циклу, що містить)

case 10:

echo "<font color=red>

Вихід з switch і

while (n=$n) </font>";

break 2;

//припиняємо роботу switch і while (двох break циклів, що містять)

default:

echo "switch працює (n=$n) ";

}

echo " while працює – крок $i <br>";

$i++;

}

echo "<br>Число ітерацій циклу $i ";

?>

continue

Іноді потрібно не повністю припинити роботу циклу, а тільки почати його нову ітерацію. Оператор continue дозволяє пропустити подальші інструкції з блока_виконання будь-якого циклу і продовжити виконання з нового круга. continue можна використовувати з числовим аргументом, який указує, скільки управляючих конструкцій, що містять його, повинні завершити роботу.

Замінимо в прикладі попереднього параграфа оператор break на continue . Крім того, обмежимо число кроків циклу трьома.

<?php

$i=1;

while ($i<=4) {

$n = rand(1,10);

// генеруємо довільне число від 1 до 10

echo "$i:$n ";

// виводимо номер ітерації і число, що згенерувалося

if ($n==5) {

echo "Нова ітерація <br>";

continue;

/* Якщо згенерувалося число 5 то починаємо нову ітерацію циклу $i не збільшується */

}

echo "Цикл працює <br>";

$i++;

}

--$i;

echo "<br>Число ітерацій циклу $i ";

?>

Результатом роботи цього скрипта буде

1:10 Цикл працює

2:5 Нова ітерація

2:1 Цикл працює

3:1 Цикл працює

Число ітерацій циклу 4

Помітимо, що після виконання оператора continue робота циклу не закінчується. В прикладі лічильник циклу не міняється у разі отримання числа 5, оскільки він знаходиться після оператора continue . Фактично за допомогою continue ми намагаємося уникнути ситуації, коли згенерується число 5. Тому можна було просто написати, замінивши оператор continue на перевірку істинності виразу:

<?php

$i=1;

while ($i<4) {

$n = rand(1,10);

// генеруємо довільне число від 1 до 10

if ($n!==5) {

echo "$i:$n <br>";

// виводимо номер ітерації і число, що згенерувалося

$i++;

}

}

?>

В PHP існує одна особливість використовування оператора continue – в конструкціях switch він працює так само, як і break . Якщо switch знаходиться усередині циклу і потрібно почати нову ітерацію циклу, слід використовувати continue 2.

4 Оператори включення

include

Оператор include дозволяє включати код, що міститься у вказаному файлі, і виконувати його стільки раз, скільки програма зустрічає цей оператор. Включення може проводитися будь-яким з перерахованих способів:

include 'ім’я_файла';

include $file_name;

include ("ім’я_файла");

Приклад 3.9. Хай у файлі params.inc у нас зберігається набір якихось параметрів і функцій. Кожного разу, коли нам потрібно буде використовувати ці параметри (функції), ми вставлятимемо в текст нашої основної програми команду include 'params.inc'.

params.inc

<?php

$user = "Вася";

$today = date("d.m.y");

/* функція date() повертає дату і час (тут – дату у форматі день.місяць.рік) */

?>

include.php

<?php

include ("params.inc");

/* змінні $user і $today задані у файлі params.inc. Тут ми теж можемо ними користуватися завдяки команді include("params.inc")*/

echo "Привіт $user!<br>";

// виведе "Привіт, Вася!"

echo "Сьогодні $today";

// виведе, наприклад, "Сьогодні 7.07.05"

?>

Приклад 3.9. Використовування оператора включення include

Помітимо, що використовування оператора include еквівалентне простій вставці змістовної частини файлу params.inc в код програми include.php. Можливо, тоді можна було в params.inc записати простий текст без всяких тегов, вказуючих на те, що це php-код? Не можна! Річ у тому, що у момент вставки файлу відбувається перемикання з режиму обробки PHP в режим HTML. Тому код файлу, який потрібно обробити як PHP-скрипт, що всередині включається, повинен бути укладений у відповідні теги.

Пошук файлу для вставки відбувається за наступними правилами.

  • Спочатку ведеться пошук файлу в include_path відносно поточній робочій директорії.

  • Якщо файл не знайдений, то пошук проводиться в include_path щодо директорії поточного скрипта.

  • Параметр include_path, визначуваний у файлі настройок PHP, задає імена директорій, в яких потрібно шукати файли, що включаються.

Наприклад, ваш include_path це . (тобто поточна директорія), поточна робоча директорія це /www/. В основний файл include.php ви включаєте файл my_dir/a.php, який у свою чергу включає b.php. Тоді парсер насамперед шукає файл b.php в директорії /www/, і якщо такого ні, то в директорії /www/my_dir/.

Якщо файл включений за допомогою include, то код, що міститься в ньому, успадковує область видимості змінних рядка, де з'явився include . Будь-які змінні викликаного файлу будуть доступні в зухвалому файлі з цього рядка і далі. Відповідно, якщо include з'являється усередині функції зухвалого файлу, то код, що міститься у файлі, що викликається, поводитиметься так, як ніби він був визначений усередині функції. Таким чином, він успадковуватиме область видимості цієї функції. Хоча ми і не знайомилися ще з поняттям функції, все ж таки приводимо тут ці відомості з розрахунку на інтуїтивне його розуміння.

Приклад 3.10. Хай файл для вставки params.inc залишиться таким же, а include.php буде наступним:

<?php

function Footer(){

// оголошуємо функцію з ім'ям Footer

include ("params.inc");

/* включаємо файл params.inc. Тепер його змінними можна користуватися але тільки усередині функції */

$str = "сьогодні: $today <br>";

$str .= "<a href='mailto:somesite.ru'>Страницу створив $user</a>";

echo "$str";

}

Footer();

// викликаємо функцію Footer(). Одержимо:

//Сьогодні: 08.07.05

//Сторінку створив Вася

echo "$user $today";

// виведе кому, оскільки ці змінні видні тільки усередині функції

?>

Приклад 3.10. Область видимості при использовани include

Окрім локальних файлів, за допомогою include можна включати і зовнішні файли, указуючи їх url-адреси. Дана можливість контролюється директивою url_fopen_wrappers у файлі настройок PHP і за умовчанням, як правило, включена. Але у версіях PHP для Windows до PHP 4.3.0 ця можливість не підтримується зовсім, незалежно від url_fopen_wrappers.

include() – це спеціальна мовна конструкція, тому при використовуванні усередині умовних блоків її потрібно брати у фігурні дужки.

<?php

/* Це невірний запис. Одержимо помилку. Ми ж вставляємо не одну команду а кілька, вони тільки записані в іншому файлі */

if ($condition) include("first.php");

else include("second.php");

// А ось так правильно.

if ($condition){ include("first.php"); }

else { include("second.php"); }

?>

Приклад 3.11. Використовування include()

При використовуванні include можливі два види помилок – помилка вставки (наприклад, не можна знайти вказаний файл, невірно написана сама команда вставки і т.п.) або помилка виконання (якщо помилка міститься у файлі, що вставляється). У будь-якому випадку при помилці в команді include виконання скрипта не завершується.

require

Цей оператор діє приблизно так само, як і #include в C++. Все, що ми говорили про include, лише за деякими виключеннями, справедливо і для require . require також дозволяє включати в програму і виконувати який-небудь файл. Основна відмінність require і include полягає в тому, як вони реагують на виникнення помилки. Як вже мовилося, include видає попередження, і робота скрипта продовжується. Помилка в require викликає фатальну помилку роботи скрипта і припиняє його виконання.

Умовні оператори на require() не впливають. Хоча, якщо рядок, в якому з'являється цей оператор, не виконується, то жоден рядок коду з файлу, що вставляється, теж не виконується. Цикли також не впливають на require(). Хоча код, що міститься у файлі, що вставляється, є об'єктом циклу, але вставка сама по собі відбувається тільки одного разу.

В реалізаціях PHP до версії 4.0.2 використовування require() означало, що інтерпретатор обов'язково спробує прочитати файл, що вставляється.

require, як і include, при використовуванні усередині умовних блоків потрібно брати у фігурні дужки.

Рішення задачі

І нарешті, повернемося до задачі, сформульованої на початку лекції. Ми хочемо створити програму, яку можна б було використовувати для відправки листів (або просто для їх генерації) із запрошеннями на різні заходи безлічі користувачів. В попередній лекції вже розглядався подібний випадок. Зараз ми винесемо всю інформацію про людей і події в окремий файл data.php і напишемо програму, не залежну (ну, може, зовсім трохи залежну) від цієї інформації і її структури. В цьому випадку для того, щоб, наприклад, розширити список адресатів, не потрібно буде змінювати скрипт, що генерує запрошення. Крім того, можна буде використовувати інформацію про людей і події в інших скриптах. В самому скрипті, що генерує запрошення letters.php, ми використовували умовні оператори, цикли, require і інші вивчені раніше конструкції.

<?php

define("SIGN","С пошаною, Вася");

// хай наш підпис буде константою

// інформація про події

$events = array(

"f" => "день відкритих дверей"

"o" => "відкриття виставки"

"p" => "бал випускників");

// наявна інформація про людей (ім'я і електронна адреса)

$people = array(

"ivan" => array(

"name" => "Іван Іванович"

"email"=>"user_ivan@intuit.ru")

"pit" => array(

"name" => "Петро Петрович"

"email" => "user_petr@intuit.ru")

"semen" => array(

"name" => "Семен Семенович"));

// хто куди запрошується

$who_where["ivan"] = "o" ;

// Іван – на виставку

$who_where["pit"] = "p";

// Петро – на бал

$who_where["semen"] = "f";

// Семен – на день відкритих дверей

?>

Лістинг 3.12. data.php

<?php

require("data.php");

// включаємо файл з даними про події

foreach($people as $key => $man_info){

// для кожної людини робимо наступне:

$event_key = $who_where[$key];

// одержуємо подію на яке він запрошується

if ($event_key<>""){

foreach($man_info as $key1 => $info){

// одержуємо ім'я і email конкретної людини

if ($key1=="name")

$str = "шановний (а) $info";

if ($key1=="email") $email = $info;

}

// складаємо запрошення

$str .= "<br>Запрошуємо Вас на ".

$events[$event_key];

switch ($event_key){

// залежно від події додаємо яку-небудь строчку

case "f":

$str .= "<br>Підтвердіть Вашу участь по телефону!";

break;

case "o":

$str .= "<br>Приходите за 15 хвилин до відкриття!";

break;

case "p":

$str .= "<br>Не забудьте подарунок :-)";

break;

}

$str .= "<br>" . SIGN . "<hr>";

// додаємо підпис

echo $str; // виводимо запрошення на екран

/* якщо у вас набудована відправка пошти з допомогою PHP, той лист можна відправити командою mail($email,"Letter",$str); */

}

}

?>

Лістинг 3.13. letters.php

Висновок

Отже, ми завершили вивчення управляючих конструкцій язика PHP. Ми прагнули привести саме основне і не заглиблюватися в різні нюанси тих або інших конструкцій. Докладну інформацію можна знайти в керівництві по PHP.

Контрольні питання

  1. В чому полягає призначення умовних операторів?

  2. Опишіть механізми роботи оператора розгалуження.

  3. Які значення перетворюються в FALSE?

  4. В чому призначення оператору elseif? Чи можна його чимось замінити?

  5. Що таке endif? Де і коли це використовується?

  6. Опишіть механізми роботи перемикача switch.

  7. Що таке цикл з точки зору мови РНР?

  8. Які цикли ви можете назвати?

  9. Що спільного в механізмах їх роботи?

  10. Які відмінності можна виділити?

  11. Що таке оператори передачі управління?

  12. В чому полягає їх призначення?

  13. Що таке оператори включення? Перерахуйте їх.

  14. Як працюють оператори включення?