PHP-4 Эффективная работа


If
While
Do..while
For
Foreach
Break
Continue
Switch
Альтернативный синтаксис представления управляющих структур
Declare
Require
Include
Require_once()
lnclude_once()

6.8. Switch

Оператор switch можно рассматривать как последовательное применение нескольких if к одному и тому же выражению. Достаточно часто вы сталкиваетесь с ситуацией, в которой необходимо сравнить одну и ту же переменную с различными константами (или другими переменными), а затем выполнить некоторые действия в зависимости от того, с каким из значений совпала проверяемая переменная. Собственно говоря, именно такой алгоритм и реализуется с помощью swi tch.

Приведенные ниже примеры демонстрируют два различных способа достигнуть одной и той же цели: первый — с помощью последовательности операторов if, а второй — с помощью swi tch:

if ($i == 0) {
          print "i равно 0" ;
}
if ($i == 1) {
          print "i равно 1" ;
}
if ($i == 2) {
          print "i равно 2" ;
}
switch ($i) {
          case 0:
               print "i равно 0" ;
               break;
          case 1:
               print "i равно 1" ;
               break ;
         case 2:
               print "i равно 2" ;
               break;
}

Для правильного использования switch необходимо понимать используемый им механизм работы. Оператор switch выполняет только те фрагменты кода, для которых выполняется условие совпадения. При этом после выполнения первого совпавшего условия работа оператора не прекращается, если только вы не поместили в него оператор break (см. раздел 6.6). Если же вы не укажете в конце исполняемой ветки на необходимость прерывания выполнения оператора, РНР-машина продолжит выполнение switch, выполняя код всех последующих вариантов case. В приведенном ниже фрагменте:

switch ($i) {
          case 0:
               print "i равно 0";
          case 1:
               print "i равно 1";
          case 2:
               print "i равно 2";
}
если $i оказывается равным 0, PHP-машина продолжит выполнение оператора и распечатает все содержащиеся в нем текстовые сообщения, если $i равно 1, то будет распечатано два последних сообщения, и только в том случае, когда $ i равно 2, программа будет работать так, как вы и ожидаете.

совет
       Не забывайте ставить в конце исполняемых вариантов break. Особенно это важно для пользователей, покинувших песочницу Delphi: в Паскале оператор выбора варианта case..of работает иначе.

В операторе switch вычисление условия производится однократно, после чего полученный результат сравнивается с каждым вариантом сasе. В операторе е1sef условие вычисляется повторно. Таким образом, если ваше условие требует значительных вычислительных затрат (например, получение значения функции, решения системы уравнений и т. д.), то предпочтительнее использовать switch

Исполняемая часть варианта, как и в Си, может быть пустой — в этом случае управление просто передается следующему варианту. Это позволяет легко и непринужденно реализовать «групповую» обработку нескольких вариантов:

switch ($i) {
          case 0:
          case 1:
          case 2:
               print "i меньше З, но не отрицательное!";
               break;
          case 3:
               print "i равно 3";
}

Существует возможность введения варианта, используемого по умолчанию, если в результате проверки условия не удалось подобрать ни одного подходящего варианта. Этот вариант всегда размещается в конце оператора switch:

switch ($i) {
          case 0:
               print "i равно 0";
               break;
          case 1:
               print "i равно 1";
               break;
          case 2:
               print "i равно 2";
               break;
          default:
               print "i содержит недопустимое значение";

Аргументом case может быть произвольное выражение, которое в результате оценки дает значение простого типа, то есть является числом или строкой. Использование массивов и объектов не допускается.

Как и ранее, вы можете использовать альтернативную форму записи оператора (см. раздел 6.9):

switch ($i):
          case 0:
               print "i равно 0";
               break;
          case 1:
               print "i равно 1";
               break;
          case 2:
               print "i равно 2";
               break;
          default:
               print "i содержит недопустимое значение";
endswiten;

6.9.Альтернативный синтаксис представления управляющих структур

Наряду с общепринятым синтаксисом управляющих структур, заимствованным из Perl и Си, РНР поддерживает также альтернативное представление для if, while, for, foreach и switch. В любой из этих конструкций при выделении вычислительных блоков допускается замена открывающей фигурной скобки на двоеточие, а закрывающая, в духе старого доброго Алгола, заменяется на endi f ;, endwhi le;, endfor ;, endforeach; или endswi tch; соответственно.

Вот как это выглядит на практике: <?php if ($bender == "здесь"): ?>
Грузите апельсины бочками!
<?php endif; ?>

В этом примере HTML-участок кода Грузите апельсины бочками! будет выводиться только при выполнении условия в предыдущей строке. Вы можете также использовать этот подход применительно к else и elseif:

if ($a == 5):

          print "А равно 5";           print "...";
elseif ($a == 6):
          print "0! А уже равно 6";
          print "!!!";
else:
          print "ни то, ни се. . .";
endif ;

6.10. Declare

Оператор declare используется для временного изменения режима работы анализатора PHP-машины внутри некоторого участка кода. Вот как это выглядит на практике:

function tick() {

       static $i;
          printf("[tick 1=%d]\n>", ++$i);
}

reg1ster_tick_funct1on("tick");

declare (ticks = 2) {
1; 2; 3;

М-да, собственно говоря, этим примером все и исчерпывается, поскольку на сегодняшний день (РНР 4.0.5) вы можете изменить только один-единственный режим —tick. Это событие, которое активизируется после выполнения очередных п инструкций PHP-машины (не операторов языка, а внутренних инструкций!). Число n задается в операторе declare. В результате выполнения приведенного выше примера будет напечатано:

[tick 1=1]
[tick 1=2]

примечание
       Надеюсь, читатель простит отсутствие снимка экрана с результатом выполнения этой программы. Поскольку обилие материала позволяет мне отказаться От «раздувания» объема книги картинками, я не буду злоупотреблять «наглядной агитацией».

Основное назначение этого механизма состоит в попытке реализации некоторого подобия многозадачности, используемого в основном для фонового ввода-вывода. Посмотрите также описания функций registert_tick_function() (раздел 9.4.2) и unregitster_t1ck_ftinct1on() (раздел9.4.3).

назад
далее

Сайт управляется системой uCoz