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

Иногда требуется немедленно завершить работу цикла либо отдельной его итерации. Для этого используют операторы 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 ";

?>

Пример 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: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.

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

Include

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

include 'имя_файла';

include $file_name;

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

Пусть в файле 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"

?>

Пример 9. Использование оператора включения include

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

Поиск файла для вставки происходит по следующим правилам.

  1. Сначала ведется поиск файла в include_path относительно текущей рабочей директории.
  2. Если файл не найден, то поиск производится в include_path относительно директории текущего скрипта.
  3. Параметр include_path, определяемый в файле настроек PHP, задает имена директорий, в которых нужно искать включаемые файлы.

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

Если файл включен с помощью include, то содержащийся в нем код наследует область видимости переменных строки, где появился include. Любые переменные вызванного файла будут доступны в вызывающем файле с этой строки и далее. Соответственно, если include появляется внутри функции вызывающего файла, то код, содержащийся в вызываемом файле, будет вести себя так, как будто он был определен внутри функции. Таким образом, он унаследует область видимости этой функции. Хотя мы и не знакомились еще с понятием функции, все же приводим здесь эти сведения в расчете на интуитивное его понимание.

Пример 10. Пусть файл для вставки params.inc останется таким же, а include.php будет следующим:

<?php

function Footer(){

// объявляем функцию с именем Footer

include ("params.inc");

/* включаем файл params.inc.

Теперь его переменными можно пользоваться,

но только внутри функции */

$str = "Сегодня: $today <br>";

$str.= "<a

href='mailto:help@intuit.ru'>Страницу

создал $user</a>";

echo "$str";

}

Footer();

// вызываем функцию Footer(). Получим:

//Сегодня: 08.07.05

//Страницу создал Вася

 

echo "$user, $today";

// выведет запятую, так как

// эти переменные видны только

// внутри функции

?>

Пример 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"); }

?>

Пример 11. Использование include()

При использовании include возможны два вида ошибок – ошибка вставки (например, нельзя найти указанный файл, неверно написана сама команда вставки и т.п.) или ошибка исполнения (если ошибка содержится во вставляемом файле). В любом случае при ошибке в команде include исполнение скрипта не завершается.

Require

Этот оператор действует примерно так же, как и #include в C++. Все, что мы говорили о include, лишь за некоторыми исключениями, справедливо и для require. require также позволяет включать в программу и исполнять какой-либо файл. Основное отличие require и include заключается в том, как они реагируют на возникновение ошибки. Как уже говорилось, include выдает предупреждение, и работа скрипта продолжается. Ошибка в 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";

// Семен – на день открытых дверей

?>

Листинг 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); */

}

}

?>

Листинг 13. letters.php

 

Дополнительное задание:

Модернизируйте код своего письма из предыдущей практической работы, используя различные виды операторов (циклы, условные опрераторы, операторы влючения и т.д.) Загрузите скрипты в корневую директорию веб-сервера и проверьте его работоспособность.

Критерии оценивания:


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: