Информационные технологииStfw.Ru 🔍

If - Управляющие структуры

Синтаксис языка и операторы
🕛 01.11.2006, 12:59
Любой PHP-сценарий состоит из последовательности команд. Это могут быть присваивания, вызовы функций, циклы, условные структуры и даже пустые команды, которые ничего не делают «:>>. Команды обычно завершаются точкой с запятой и могут быть сгруппированы с помощью фигурных скобок (как в С}. Группа команд в фигурных скобках сама является командой (только без знака «;» в конце).

if

Одна из основных условных конструкций - if, она позволяет исполнить фрагмент кода при определенном условии. Ее синтаксис сходен с синтаксисом в С:
if (условное_выражение) команда;

Как было описано выше, условное выражение проверяется на соответствие значению «истина». Если оно равно TRUE, PHP выполняет следующую команду, иначе - игнорирует ее.
if ($а > $b)
print "a is bigger than b";

Часто нужно выполнить группу команд при определенном условии, тогда они группируются с помощью фигурных скобок.
if ($а > $b) {
print "a is bigger than b":
$b = $a; } Условные структуры могут быть вложенными.
else

Иногда требуется, чтобы при одном условии выполнялось одно действие, а в противном случае - другое; для этого используется ключевое слово else, расширяющее возможности if.
if ($a > $b) {
print "а больше чем b"; }
else { // ($а <*- $b)
"N print "а не больше чем b":

Фрагмент else выполняется только в том случае, если условное вы-/ ражение в скобках после if имеет значение FALSE, и другие выражения elseif (если они существуют), также имеют значение FALSE (см. ниже).

elseif

Условная конструкция elseif, как видно из названия, - комбинация if и else. Подобно else, она требует, чтобы основное выражение if равнялось FALSE, но также требует, чтобы се собственное выражение равнялось TRUE.
if ($a > $t» {
print "а больше чем b"; }
elseif ($а == №) {
print "а равно b". } else {
piint "а меньше чем b";

Можно иметь несколько подблоков elseif в одном блоке if. Из нескольких блоков elseif исполняется первый, который равняется TRUE. В PHP elseif можно писать также как else if (двумя словами), и смысл при этом не теряется. Таким образом, elseif-блок исполняется, только если начальное выражение if и любое другое, предшествующее el self-выражение равняются FALSE, а текущее elseif - TRUE.

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

Для управляющих структур if, while, for, foreach, и switch PHP предоставляет альтернативный синтаксис записи. Изменения выражаются в том, что после условного выражения в круглых скобках ставится двоеточие (:), затем следует фрагмент кода, подлежащий условному выполнению, завершающийся соответственно словами: endif;, endwhile;, endfor;, endforeach; или endswitch;. Использование фигурных скобок (для группировки условного фрагмента кода) при этом не требуется.
<?php if ($а == 5)- ?>
A is equal to 5 <?php endif; ?>

В примере html-блок «A is equal to 5» включается в генерируемую страницу при условии, что $а равно 5.
if ($a == 5):
print "a equals 5";
print "...".-elseif ($а == 6):
print "a equals 6";
print "!!!": else-
print "a is neither 5 nor 6": endif:

while

Цикл while - самый простой в PHP, он аналогичен своему тезке в С.
while (expr) statement:

Его смысл - повторять выполнение команды до тех пор, пока выражение истинно (TRUE). Проверка значения происходит каждый раз до выполнения команды. Если условное выражение не изменяется (в команде/блоке), то цикл будет исполняться бесконечно. Если условное выражение изначально ложно (FALSE), условный блок игнорируется и выполняться не будет. Блок условного кода может быть органичен фигурными скобками или двоеточием и словом endwhile;. Следующие два примера приводят к идентичному результату (они печатают числа от \ до 10):
/* пример 1 */
$1 =1:
while ($1 <= 10) {
print $i++: /* постинкремент */ )
/* пример 2 */ $1 = 1; while ($i <= 10):
print $1:
$i++: endwhile;
do..while

Циклы do. .while сходны с циклами while с тем отличием, что выражение проверяется на истинность не до исполнения блока, а после него. То есть гарантируется, что условный блок будет исполнен минимум один раз.
$1 = 0: do {
print $i; // напечатает «О» один раз
while ($i>0). // условие не выполняется
($i не больше 0)

Следующий пример демонстрирует сложный (однократный) цикл и использование команды «break;» (ради тренировки попробуйте разобраться, что он делает).
do {
if ($i < 5) {
print "i is not big enough", break:
// досрочно завершить цикл $i *= $factor.
if ($1 < Smimmumjimit) {
break: // досрочно завершить цикл
print "i is ok", * process i... } while(O);
// 0 блокирует дальнейшее выполнение цикла

for

Циклы for - наиболее сложные в РНР.

for (exprl; expr2; ехргЗ) statement:

Первое выражение exprl выполняется безусловно, один раз, до начала цикла (обычно это инициализация переменной-счетчика цикта) Перед началом каждой итерации цикла на истинность проверяется условие ехрг2, и если оно истинно (TRUE), то цикл выполняется i конце каждой итерации цикла выполняется ехргЗ (часто это инкремент счетчика цикла).

Каждое из выражений может быть пустым (то есть «;»). Если выражение ехрг2 - пустое, то цикл является бесконечным (РПР по умолчанию считает его равным TRUE) и его прерывание возможно только осредством использования внутри его блока команды break. Сравните примеры ниже, все они выводят числа от 1 до 10.

/* Пример 1 - Классический стиль*/
for ($1 = 1; $1 <= 10; $1++) {
print $1: } /* Пример 2 */
for ($1 = 1;;$!++) {
if ($i > 10) {
reak: }
print S1: } /* Пример З */
$i = 1;
for (:.) {
if ($1 > 10) { break. }
print $1.
$i++; }
/* Пример 4 - Модернистский стиль*/
for ($1 - 1. $1 <= 10; print $1. $i++) ;

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

РНР также поддерживает синтаксис ограничения блока цикла двоеточием:
for (exprl: expr2. ехргЗ) statement: :
endfor; См. также циклы foreach ниже.

foreach

В РНР 4 включена инструкция foreach, позволяющая осуществлять поэлементно одинаковый набор действий для каждого элемента массива. Конструкция может иметь два варианта синтаксиса:
foreach($naccHB as $значение_элемента)
действия; foreach($MaccnB as $key =>
1значение_элемента)
действия:

Первая форма цикла перемещается по элементам массива, указанным как $массив. При каждой итерации значение текущего элемента присваивается переменной $значение_элемента, внутренний курсор массива (указатель на текущий элемент массива) смещается на следующий элемент и при следующей итерации мы получаем следующий элемент. Вторая форма делает то же самое, но мы можем дополнительно использовать индексное значение массива в переменной Skey (что полезно при работе с ассоциированными массивами). Если вторая форма цикла работает с одномерным, не ассоциированным массивом, то значения Skey и $значение_элемента будут одинаковы.

При первом прохождении цикла foreach курсор массива автоматически сбрасывается для указания на первый элемент массива; таким образом, не требуется вызывать функцию reset() перед запуском цикла foreach.

Также отметим, что цикл foreach оперирует с копией массива, а не с самим массивом, и поэтому курсор самого массива не изменяется, как в конструкции each.

Следующие примеры функционально идентичны:
// работа с численно индексированным
массивом $агг = array (1. 2. 3. 17): reset ($arr):
while (list(. Svalue) = each ($arr))
{ echo "Value: $value<br>\n"; }
foreach ($arr as $value) {
echo "Value $value<br>\n": }
// Следующие примеры также функционально идентичны:
$агг = array ( "one" => 1.
"two" => 2.
"three" => 3.
"seventeen" -> 17 ).
reset ($arr).
while (list($key. Svalue) = each ($arr)) { echo "Key: Skey; Value:
$value<br>\n"; }
foreach ($arr as $key => Svalue) {
echo "Индекс. Skey: Значение: $value<br>\n":
// print "\$a[$key] => Sa[$key] \n"
// Можно и так написать }

break

break прерывает выполнение циклов for, while, и структур switch, break имеет необязательный аргумент, определяющий, сколько вложенных циклов необходимо прервать.
$arr = array ('one'. 'two', 'three', 'four', 'stop', 'five'):
// массив строк
while (list (. $val) = each (Sarr)) {
// эквивалент записи: foreach(Sarr as $val)
if ($val == 'stop') {// если элемент массива
break. /* здесь также
можно написать: break 1; */ }
echo "$val<br>\n"; }
'* Использование необязательного
аргумента. */ $i = 0:
while (++$i) { snitch ($i) { case 5.
echo "At 5<br>\n";
break 1. /* Выйти только из switch */ case 10:
echo "At 10; quittihg<br>\n":
break 2. /* Выйти из структуры switch и
цикла while. */ default: break: }}

continue

continue используется в циклических структурах для того, чтобы избежать выполнения оставшейся части цикла и перейти к следующей итерации, continue, подобно инструкции break; может име'гь числовой аргумент, показывающий, на сколько вложенных циклов должно распространяться се действие.
while (list ($key. $value) = each ($arr)) {
if (!($key % 2}) { I! пропустить нечетный
элемент continue.
обработать_четный_элемент (Svalue); }
$1 = 0;
while ($i++ < 5) {
echo "цикл 1-го уровня <br>\n"; while (1)
{
echo " цикл 2-го уровня <br>\n"; while (1) { echo " цикл 3-го уровня <br>\n".
continue 3: }
echo "Эта строка никогда не
будет выведена.<br>\n": }
echo " .. .Эта тоже -br>\n". }
echo "Все завершено.<br>\n":

switch

Конструкция switch эквивааснтна последовательности конструкций if, имеющих одно общее условное выражение. Часто приходится выполнять проверку одной переменной (или выражения) на соответствие различным значениям и соответственно выполнять различные наборы инструкций в каждом случае. Это именно то, для чего предназначена конструкция switch.

Следующие два примера демонстрируют замену нескольких конструкций if на одну switch:
if ($1 - 0) {
print "1 равно 0"; }
if ($1 == 1) {
print "i равно 1": }
if ($1 - 2) {
print "i равно 2". }
switch ($1) { -ase 0:
print "i равно О"; break; case 1:
print BI равно 1": break; case 2
print "i равно 2"; break. }

В конструкции switch инструкции case проверяются одна за другой, и когда обнаруживается соответствие переменной (выражения) значению, указанному после слова case, исполняются все последующие строки, пока не встретится слово break. Если слово break не указано, выполнение продолжается до конца switch-блока.
switch ($1) { case О
orint "i равно О"; Cdse 1:
print "i равно 1".
case 2:
print "i равно 2": }

В этом примере, если $i равно О, РНР выполнит все три инструкции print! Если $i равно 1, будут выполнены две последние команды print, и только если $1 равно 2, вы получите единственное «ожидаемое»;сообщение: i равно 2. Поэтому не забывайте указывать слово break в каждом блоке case.

В конструкции switch условное выражение вычисляется только раз и проверяется на соответствие каждому варианту case. В el seif- конструкциях условие проверяется заново (и выражение вычисляется заново), поэтому switch-конструкции выполняются быстрее, если выражение сложное. Блок case также может быть пустым, тогда РНР просто переходит к следующему case (см. объяснение выше).
switch ($1) { case О case l-case 2:
print "i равно 0. или 1. или 2": break: case 3
print "i равно З"; }

Особый случай case - это case по умолчанию - default. Он используется в том случае, когда ни один из вариантов не соответствует условному выражению.
switch ($1) { case С:
print "i равно О";
break; case 1:
print "i равно 1";
break: case 2
print "i равно 2";
break; default
rint "i не равно ни 0, ни 1. ни 2": }

Выражение после слова case может быть любым, способным иметь значение и простой тип, то есть целым либо дробным числом или строкой. Массивы и объекты не могут быть использованы в этом I случае, если только они не могут быть приведены к простому типу.

Для конструкций switch возможен альтернативный синтаксис.
/ switch ($1). // вместо открывающей фигурной скобки case 0: print "1 равно О": break, default:
print "i не равно 0. 1 и 2"; endswltch:
// вместо завершающей фигурной скобки
Директивы require() и include()

Директивы require() и include() заменяются интерпретатором в ходе выполнения на содержимое файла, указанного в этих директивах (их аналогией является директива С препроцессора include). Если в конфигурации РНР разрешен параметр «URL fopen wrappers» (по умолчанию он разрешен), в этих директивах, наряду с локально доступными файлами можно использовать файлы из сети Интернет путем указания их URL (для Widows эта возможность пока недоступна). См. функцию fopen().

Файл, включаемый данными директивами, считается файлом HTML, поэтому если он содержит код РНР, то должны присутствовать теги-ограничители (например, <? и ?>), чтобы этот код выполнялся. Обычный синтаксис:
require ('header.тс'). // возможна
также запись: require "header nnr":

Фактически require() не функция, а специальная конструкция языка. В руководстве по РНР говорится, что «на нее не влияют условные конструкции». Но при проверке на практике выяснилось, что require() функционирует так же, как и include(), то есть на нее влияют условные структуры и в цикле с перечислением имен включаемых файлов она заменяет имена файлов. Директива require() выполняется всегда, вне зависимости от того, выполняется ли код, ею подставляемый. Она не возвращает значение (include() может возвращать значение с помощью команды return).

Директива include() - это «почти» функция. Характерный пример ее применения:
Sfiles = array ('first.inc'. 'second.inc'. 'third.me'); for ($1 = 0: $1 < count($flies); $i++)
{ include $files[$i]: }

Руководство по РНР требует заключения include() в фигурные скобки в условных конструкциях (но, как я выяснил, в этом нет необходимости).

Включаемые файлы также наследуют все переменные, доступные вы-зываюшему сценарию, с теми значениями, которые они имеют в той строке, где встречается директива включения. Если директива включения встречается в объявлении функций или класса, содержимое включаемого файла ведет себя, как если бы оно находилось вместо директивы включения.

include() также позволяет возвращать значение из включаемого сценария командой return (это завершает выполнение включаемого сценария).
<?php // file test.тс echo
"До return <br>\n"; if (11 { return 27: }
echo "После return <br>\n": ?>
<?php // main file (main.php)
Sretval = include ('test.inc'):
echo "Возвращенное значение:
'Sretval'<br>\n":
>>
/I Запуск main.php выведет:
// До return <br>
// Возвращенное значение. '27'<br>

Если необходимо передать во включаемый сценарий аргументы (как при вызове функций), это можно сделать двумя способами: установкой глобальных переменных и вызовом сценария посредством HTTP-запроса (с передачей параметров в адресе URL). Однако не стоит забывать, что во втором способе надо задавать полный адрес URL (чтобы обращение происходило к web-серверу, а не локальному файлу) и что при этом включаться будет не сам код, а результаты его выполнения; помимо этого, сервер должен быть способен выполнить запрашиваемый сценарий.
require ("file php7varone=l&vartwo=2"): // не работает (это не URL) require
("http://someserver/file.php?varone=l&vartwo=2"); // работает Svarone = 1: Svartwo = 2:
require ("file txt");
/* Можно включать локальные файлы
с любым расширением */
См. также: readfile() и virtuaH).


require_once() и include_once()

Эти директивы аналогичны вышеописанным с тем отличием, что они Ш не допускают повторного включения файла, если его включение уже происходило. Это позволяет избежать возникновения ошибок при множественном включении файлов - например, когда это приводит к ситуации повторного определения функции (что вызывает ошибку в РНР), повторного назначения констант и т. п.

См. также: get_required_files(), get_included_files(), readfile() и virtual().

Учебник по основам PHP   Теги:

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉