Сайт о телевидении

Сайт о телевидении

» » Продолжение цикла и выход из него. PHP: операторы break, continue и goto

Продолжение цикла и выход из него. PHP: операторы break, continue и goto

В Си-подобных языках для этой цели служит оператор «break». Однако бывают такие ситуации, когда условие выхода удобнее проверить не в заголовке цикла, а «по месту требования».

В случае вложенных циклов бывает необходимо покинуть не только текущий вложенный цикл, но цикл, его объемлющий. Этом случае можно выйи из положения за счёт дополнительных переменных: for (int i=0; i Не очень красивое решение. Вот поэтому подобные случаи являются оправданием «goto»: for (int i=0; i Это короче, элегантнее, но... с «goto»! Это тот самый «goto», который стал причиной многих психических заболеваний, банкротств и падений индекса NASDAQ. А нельзя ли так же кратко, но без любимого врага Дейкстры, о котором мы поговорим в следующей статье ? Может, в других языках есть приёмы получше?

Java

В Java для избавления от «goto» применяется техника именованных блоков. LOOP: for(int i=0; i Хотя значительно нагляднее было бы так: for(int i=0; i Есть сильное подозрение, что так не сделали только потому, что это очень смахивает на простую замену ключевого слова «goto» на «break».

PHP

В PHP выход из вложенного цикла выглядит, на мой взгляд, значительно элегантнее. После «break» указывается количество вложенных циклов, которые должен «покинуть» оператор «break». В приведённом примере, который аналогичен приведённому выше для Java, «break» должен «пересечь» две фигурные скобки «}», чтобы оказаться за пределами двух циклов. for($i=0; $i

Такое усовершенствование пришло в голову автору этих строк задолго до знакомства с PHP. Такое «параллельное изобретение» подверждает невозможность полной монополии на хорошие идеи. Но поскольку имелись идеи не только насчёт «break N», то при знакомстве PHP обратил внимание, что в нём нет «continue N». Идея, которая вполне «симметрична» предыдущей. Хотя для применения «continue N» не очень легко привести пример из жизни для иллюстрации его полезности. Возможно, читатели этих строк предложат что-то в комментариях к статье.

Итог

И так, теперь нам необходимо найденные находки изложить в систематизированном виде в сочетании с нашим «симметричном скобочном» стиле: (int i=0 loop i Замена ключевого слова «break» на «exit», как видится, больше соответствует смыслу выполняемого действия. Но это для тех, кто предпочитает программировать с использованием английских идентификаторов. Для приверженцев повсеместного употребления русской речи ключевое слово одно - «выход». Ну и теперь, конечно, было бы интересно узнать, какой графический (вместо синтаксического) сахар должна предлжить программисту IDE. Было бы логичным увидеть примерно такое:

// Вложенный цикл // Выход из вложенного цикла ) // Операторы цикла ) // В программе на С здесь бы поставили метку типа «end_loop:;» )

Получается очень наглядно. Стрелки от ключевого слова «exit» показывает, из какого цикла будет произведён выход. Если же «exit» имеет числовой операнд, то стрелка должна пересечь границы нескольких циклов. Величина операнда равна числу покидаемых циклов. Оператор «continue» сопровождается другого рода стрелкой, вид которой напоминает о возврате к началу цикла.

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

Отзывы

2013/05/07 16:37 , koba

Вообще говоря, выход из глубоко вложенного цикла за пределы внешнего цикла является единственным оправданием любителей goto. В действительности такие любители не понимают, а их оппоненты не показывают (может быть, тоже не понимают), одного обстоятельства, которое показывает их слабое понимание принципов программирования. Посмотрим, в чём смысл нескольких вложенных циклов, из которых из самого внутреннего приходится делать выход? А смысл очень простой: проверяется некоторое множество абсолютно равноценных элементов, но это множество программист по тем или иным причинам разрезал на несколько измерений. То есть он некие элементы представил как неравноценные, но при этом хочет обрабатывать их как равноценные. Разумеется, это противоречие такие программисты не только не могут разрешить, но даже не знают о его существовании. То есть они сканирование множества в целом заменяют сканированием отдельных измерений. Поэтому им приходится использовать такой несуразный приём как выпрыгивание наружу.

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

Было с goto и вложенными циклами так: int matrix[n][m];
int value;
...
for(int i=0; i for (int j=0; j if (matrix[i][j] == value) {
printf("value %d found in cell (%d,%d)\n",value,i,j);
goto end_loop;
}
printf("value %d not found\n",value);
end_loop: ; Стало без goto и с одним циклом так (пример на C): int matrix[n][m];
int value;
...
int i = 0;
int j = 0;
int f;

while (!((f = (matrix[i][j] == value)) !! (i == n) && (j == m)))
if (!(j = ++j % m)) i = ++i % n;

if (f) printf("value %d found in cell (%d,%d)\n",value,i,j);
else printf("value %d not found\n",value);

Ну давайте представим, что у нас есть массив ссылок, который мы перебираем в объемлющем цикле. Элементы этого массива ссылаются, скажем, на ещё какие-то массивы неодинаковой длины. Эти массивы мы будем перебирать во внутреннем цикле. Не правда ли, это логично? И если перед нами стоит задача поиска, то найдя нужный элемент, мы смело даём команду «exit 2» и выходим обоих циклов. Заурядная задача, заурядное решение, но кратчайшим способом .

2014/01/31 10:40 , Pensulo

Пример решения предложенной Вами задачки на VisualBasic с применением всего одного цикла: Const iMax As Integer = 100
Private Source(1 To iMax) As Variant
" Source - одномерный массив состоящий из ссылок
" на другие одномерные массивы переменной длинны.
Function SearchInArray(Required As String) As Boolean

i = 1: SearchInArray = False
Do
j = LBound(Source(i)) " Получить начальный индекс переменного массива
SearchInArray = True
Exit Do " В данном примере можно сразу употребить "Exit Function"
End If
j = j + 1
If j > UBound(Source(i)) Then
" Анализировать выход за конечный индекс переменного массива
i = i + 1
End If
Loop Until i > iMax
End Function Аналогично эту задачу можно решить на любом ЯВУ без употребления оператора выхода из объемлющего (внешнего) цикла.

Решение с двумя циклами привожу следом. Отмечу при этом, что и в этом случае не потребовался оператор выхода из объемлющего (внешнего) цикла: Function SearchInArray2(Required As String) As Boolean
Dim i As Integer: Dim j As Integer
i = 1: SearchInArray2 = False
Do
j = LBound(Source(i))
Do
If Source(i)(j) = Required Then
SearchInArray2 = True
Exit Do "Опять же в данном примере можно сразу употребить "Exit Function"
End If
j = j + 1
Loop Until j > UBound(Source(i))
If SearchInArray2 = True Then
" Этот анализ можно опустить в случае использования "Exit Function" ранее
Exit Do
End If
i = i + 1
Loop Until i > iMax
End Function

Приведённый Вами пример использует дополнительные переменные, чтобы указать внешнему циклу - продолжать его или нет. Т.е. заведомо более длинное решение.

2014/02/25 15:49 , Руслан

Более короткое далеко не всегда лучше чем более длинное решение. В любом случае решение по феншую будет лучше.

2014/07/02 05:56 , utkin

Получается очень наглядно. Стрелки от ключевого слова «exit» показывает, из какого цикла будет произведён выход. Если же «exit» имеет числовой операнд, то стрелка должна пересечь границы нескольких циклов. Величина операнда равна числу покидаемых циклов. Оператор «continue» сопровождается другого рода стрелкой, вид которой напоминает о возврате к началу цикла.

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

В IDE должны быть настройки, которые включают или отключают показ тех или иных графических элементов, например: «сопровождать стрелкой оператор выхода», «сопровождать условные операторы значками» и т.д. Тогда каждый настроит себе по вкусу.

2014/11/07 11:30 , Сергей

2 koba Сокращение уровня вложенности циклов («уплощение») является чисто техническим приёмом, который в данной ситуации имеет только одну цель - избежать выхода из глубоко вложенного цикла. Однако результат достигается за счёт потери наглядности и понятности кода. Использование «exit 2» в данной ситуации не несёт никаких вредных последствий, полностью сохраняет эффективность кода и, самое важное, не причиняет вреда лёгкости чтения и понимания кода.

2014/11/27 09:06 , enburk

1
Даже вариант с goto читается мгновенно. В исправленный же вариант приходится вглядываться и размышлять, что замыслил автор...

Предложил бы ещё вместо «exit 2» писать «exit exit».

Тоже вариант. Вот только при обходе многомерного массива в цикле нужно будет писать «exit exit ... exit».

2015/11/02 01:04 , Nick

2 Сергей
+1

2 coba
но если уж на то пошло, то для С можно было и попроще написать: int matrix[n][m];
int value;
int f;

for(int i = n * m; --i >= 0 && f = (matrix[i] != value););

if (!f) printf("value %d found in cell (%d,%d)\n",value,i,j);
else printf("value %d not found\n",value); И вообще все эти continue, break и т.д. просто синтаксический сахар.
continue легко заменяется оператором if() {}. break не совсем конечно сахар, т.к. для замены дополнительная переменная нужна, но если бы goto не злоупотребляли, то и break не понадобился бы... (но "бы" мешает)
P.S. Даже эта запись int matrix[n][m]; - синтаксический сахар. Но если из языков убрать этот сахар, будет ассемблер.

Двухмерные матрицы - самый простой способ показать случай, когда «goto» полезен, потому что короче. При отсутствии иных вариантов, конечно. Но «break N» элегантно устраняет этот наверное единственный обоснованный случай применения «goto» - не правда ли? А для работы с элементами множеств лучше использовать цикл «foreach».

2016/07/03 13:36 , rst256

Нет не правда, там не нужен goto? Как и не нужен лишний цикл, хороший правильный вариант тут уже продемонстрировали.
А вот первый попавший под руку код с goto: static size_t utf8_decode(const char *s, const char *e, unsigned *pch) {
unsigned ch;

If (s >= e) {
*pch = 0;
return 0;
}

Ch = (unsigned char)s;
if (ch < 0xC0) goto fallback;
if (ch < 0xE0) {
if (s+1 >= e !! (s & 0xC0) != 0x80)
goto fallback;
*pch = ((ch & 0x1F) << 6) !
(s & 0x3F);
return 2;
}
if (ch < 0xF0) {
if (s+2 >= e !! (s & 0xC0) != 0x80
!! (s & 0xC0) != 0x80)
goto fallback;
*pch = ((ch & 0x0F) << 12) !
((s & 0x3F) << 6) !
(s & 0x3F);
return 3;
}
{
unsigned res = 0;

goto fallback; /* invalid byte sequence, fallback */
res = (res << 6) ! (cc & 0x3F); /* add lower 6 bits from cont. byte */
ch <<= 1; /* to test next bit */
}
if (count > 5)
goto fallback; /* invalid byte sequence */
res != ((ch & 0x7F) << (count * 5)); /* add first byte */
*pch = res;
return count+1;
}

fallback:
*pch = ch;
return 1;
} Если код под fallback кажется вам достаточно небольшим, чтобы расплодить его заместо вызова goto, то представьте в добавок нему ещё пару сотен строк, сути это не поменяет

If (s >= e) {
*pch = 0;
return 0;
}

Ch = (unsigned char)s;
if (ch < 0xC0)
if (ch < 0xE0) {
if (s+1 >= e !! (s & 0xC0) != 0x80)
fallback(*pch, ch); return 1;
*pch = ((ch & 0x1F) << 6) !
(s & 0x3F);
return 2;
}
if (ch < 0xF0) {
if (s+2 >= e !! (s & 0xC0) != 0x80
!! (s & 0xC0) != 0x80)
fallback(*pch, ch); return 1;
*pch = ((ch & 0x0F) << 12) !
((s & 0x3F) << 6) !
(s & 0x3F);
return 3;
}
{
int count = 0; /* to count number of continuation bytes */
unsigned res = 0;
while ((ch & 0x40) != 0) { /* still have continuation bytes? */
int cc = (unsigned char)s[++count];
if ((cc & 0xC0) != 0x80) /* not a continuation byte? */
fallback(*pch, ch); return 1; /* invalid byte sequence, fallback */
res = (res << 6) ! (cc & 0x3F); /* add lower 6 bits from cont. byte */
ch <<= 1; /* to test next bit */
}
if (count > 5)
fallback(*pch, ch); return 1; /* invalid byte sequence */
res != ((ch & 0x7F) << (count * 5)); /* add first byte */
*pch = res;
return count+1;
}
} Так сойдёт? Но если бы из функции можно было возвращить несколько значений, то «return 1, pch» смотрелось бы красивее.

2016/08/10 18:55 , rst256

Так сойдёт? Но если бы из функции можно было возвращить несколько значений, то «return 1, pch» смотрелось бы красивее.

Наверное да. Я по, крайней мере, поступил именно так при адаптации данного кода под лексер, у вас ведь тоже, как я понимаю, fallback(*pch, ch) - это макрос?

2017/09/19 13:27 , Comdiv

Многие видели заголовок статьи Дейкстры, но немногие её читали. Дейкстра возражает против непоследовательных процессов, а goto - всего лишь способ нарушения, который присутствовал в языках того времени. Теперь наплодили много специализированных аналогов goto для частных случаев, посчитав, что они решили проблему, но несмотря на то, что такие ограниченные goto лучше, чем полноценный goto, это не решает проблему принципиально. Там, где критически важна корректность кода, неструктурные выходы не практикуются. Примером может служить MISRA C, являющаяся стандартом де факто для встраиваемых систем в автомобилях. В этих требованиях неструктурные переходы запрещены почти полностью, включая преждевременный return. Исключение сделано для единственного break на цикл.

Я задавал вопрос Андрею Карпову, разработчику статического анализатора кода PVS-Studio, как влияет на качество работы анализатора оператор «goto», а так же «break», «continue» и «return». Ответил одним словом: «Плохо». Правда, непонятно, отнёс он это только к «goto», или к другим операторам тоже. Обещал написать статью на эту тему, но что-то не идёт к нему вдохновение...

2018/06/24 21:39 , rst256

Имеет значение лишь то, сколь хорошо мы код свой понимаем и как четко представляем его работу в каждой из возможных ситуаций. Кроме нас самих никто не сможет избавить наш код от ошибок и багов: ни самое строгое соблюдение всех правил, ни самая идеальная и надежная парадигма, ни самый лучший и продвинутый статический анализатор.

Спору нет, без мозга - никуда. Да не простого, а обременённого соответствующими знаниями. Но мозг может устать, потерять внимательность, не совладать с объёмом информации, который надо держать в голове одновременно. И тут приходят на помощь вспомогательные инструменты. Почитаешь о том, какие ошибки находят анализатора кода, и думаешь: «Нет, в таком частоколе букв, цифр и знаков я бы искал ошибку до поседения». Всему своё место: мозгу - творческая работа, инструментам - рутина. Ну и язык должен предостерегать, по возможности, от ошибок.

Очень часто при написании скриптов требуется выполнить одно и тоже действие несколько раз. Для этого и нужны циклы. Циклы в php , как и в других языках, делятся на несколько типов:

  1. Цикл со счетчиком for
  2. Цикл с условием while, do-while
  3. Цикл для обхода массивов foreach

Например, при создании интернет магазина , нам нужно до вывода товаров на экран, убрать товары, остаток на складе которых ниже 10. Для этого мы в цикле обходим массив с товарами, и при помощи условного оператора if, сверяем кол-во товаров на складе, и убираем из массива все товары, у которых значение на складе меньше 10.

Цикл For в PHP

Цикл со счетчиком for - выполняется определенное количество раз. Рассмотрим пример:

"; } ?>

В этом примере цикл будет выполняться 11 раз. От 0 (т.к. переменная $i = 0) до 10 (т.к. $i <= 10). Каждую итерацию $i будет увеличено на 1 ($i++). Чтобы было понятней, сделаем еще один пример:

"; } ?>

Цикл будет выполняться от 5 и до 9 ($i < 10 (в предыдущем примере было <= 10)).

Так же цикл можно выполнять в обратном порядке:

5; $i--) { echo "Номер итерации: $i
"; } ?>

Цикл будет выполнен от 10 и до 5.

Так же цикл можно выполнять с определенным шагом, рассмотрим пример:

"; } ?>

В цикле будет выполнено 3 итерации (0, 5, 10) с шагом 5. Каждую итерацию, счетчик цикла будет увеличен на 5.

Цикл foreach в PHP

Цикл foreach - самый распространенный цикл. Требуется почти во всех скриптах, особенно если php скрипт работает с базами данных. Используется для обхода массивов.

Например, рассмотрим небольшой пример:

$value) { echo "Ключ: $key, Значение: $value
"; } ?>

Запустив скрипт вы увидете:

Ключ: 0, Значение: red Ключ: 1, Значение: blue Ключ: 2, Значение: green Ключ: color, Значение: yellow Ключ: test, Значение: дизайн студия ox2.ru

Цикл while в PHP

Цикл while используется для выполнения цикла до тех пор, пока выполняется условие. Если условие ни когда не будет выполнено, то цикл зациклиться.

Рассмотрим пример:

"; } ?>

На экране увидим числа от 1 до 19

Цикл do-while в PHP:

Цикл do-while - работает точно так же как и цикл while , единственное отличие что условие выполняется после итерации. Напишем пример:

"; } while ($i < 20); //Выполняем цикл до те пор, пока $i < 20 ?>

На экране увидим числа от 1 до 20. Обратите внимание, что в предыдущем примере с циклом while было от 1 до 19, т.к. условие выполнялось до итерации цикла.

Для того чтобы прервать цикл существует функция break , она позволяет выйти из цикла , не зависимо от того сколько итераций осталось до окончания цикла.

Для того чтобы пропустить итерацию, и перейти к следующей итерации - есть функция continue .

При создании сайтов циклы используются практически всегда, не зависимо от стоимости создания сайта , функционала и других вещей. Поэтому отнеситесь к ним серьезно!

Очень часто при написании скриптов требуется выполнить одно и тоже действие несколько раз. Для этого и нужны циклы. Циклы в php, как и в других языках, делятся на несколько типов: Цикл со счетчиком for Цикл с условием while, do-while Цикл для обхода массивов foreach

OX2 2014-10-02 2014-10-02

Операторы цикла используются очень часто в любых языках программирования. Почти все задачи используют циклы, поэтому стоит обратить особое внимание на их изучение. В PHP существуют 4 вида циклов:

  • while (префиксная проверка условия);
  • do..while (постперфиксная проверка условия);
  • for ;
  • foreach ;

Первые три цикла похожи на стандартные циклы из языков программирования (С++, Pascal), а последний (foreach) на Perl. Рассмотрим в отдельности первые три операторов цикла, а последний будет рассмотрен в отдельном уроке. Отметим то, что каждый из циклов допускает вложенные циклы, то есть цикл внутри цикла.

Оператор цикла while в PHP

Довольно простой оператор цикла, синтаксис которого очень похож на синтаксис в других языка программирования.

Синтаксис while в PHP:

//может быть сложное логическое условие { операторы; } ?>

В условие стоит некое выражение, которое должно быть либо истинным (true), либо ложным (false). В случае истинного значения условия выполняются операторы, которые стоят в фигурных скобках. После чего опять происходит проверка условия на истинность. Если условие ложное, то программа не входит в цикл. В случае одного оператора фигурные скобки можно опустить.

Примечание : условие может состоять из очень многих выражений с использованием алгебры логики &&, ||, ! и т.д.

Стоит обратить внимание на то, что если в условие есть операторы, то они должны как-то изменяться, иначе цикл просто зациклиться.

Приведу простой пример на использование while :

"; $i++; } ?>

Выше описанный пример выведет следующий результат:

i = 0
i = 1
i = 2
i = 3
i = 4

Обратите внимание, что $i=5 не будет выведено, т.к. i увеличивается в самом конце цикла и поэтому как только он достигнет 5, то условие входа в цикл просто не выполнится.

Оператор break в PHP

Для немедленного прекращения цикла есть специальный оператор break . Данный оператор часто используется для выхода из бесконечного цикла, когда условие всегда истинно. Например, выше описанный пример можно было написать следующим образом:

//условие всегда истинно { echo "i =".$i."
"; $i++; if($i>=5) break; } ?>

Результат будет такой же, как и в предыдущем примере.

Оператор continue в PHP

Оператор continue; прекращает текущую итерацию цикла, перемещаясь в начало, но не прекращает цикл полностью. Например:

//условие всегда истинно { echo "i =".$i."
"; $i++; if($i>=5) break; else continue; } ?>

Результат этого примера будет таким же, как и у предыдущих примеров.

Как показывает практика, операторы continue; и break; зачастую помогают реализовать сложные циклы.

Приведу ещё пример по использованию цикла while :

"; } //результаты этих двух while будут разными //из-за постпрефиксной и префиксной формы $i=0; while (++$i //префиксная форма { echo "i =".$i."
"; } ?>

Оператор цикла do...while в PHP

Оператор do...while очень похож на обычный while . Единственное их отличие во времени проверки условия. Цикл do...while будет выполнен хотя бы один раз, поскольку проверка происходит в самом конце. Синтаксис do...while :

Рассмотрим пример:

"; $i++; } while($i

Его результат аналогичен первым рассмотренным примерам.

Стоит отметить, что операторы continue; и break; также могут применяться в таких циклах.

Оператор цикла for в PHP

Синтаксис оператора for следующий:

В start происходит начальная инициализация переменных. В usloviya должны стоять одно или несколько условий завершения цикла. В shag заносятся операторы, которые выполняются в конце каждой итерации. Например:

"; } ?>

Результат выполнения этого цикла будет таким же как и у предыдущих примеров.

Большим плюсом использования for , что тело цикла может отсутствовать, а все необходимые операции выполнены в разделе shag . Для наглядности приведем пример:

", $i++); ?>

Замечание : в shag недопустимо использование функции echo .

Шаг цикла и условия могут быть самыми разнообразными. Например, можно написать не i++, а i+=5 (инкремент на 5).

Каждый из разделов цикла for может быть опущен, в таком случае получается бесконечный цикл:

for допускает использование continue; и break; .

На последок приведем пример двух эквивалентных конструкций цикла, но один будет for, а другой while

Эквивалентна следующей:

Оператор break

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

Оператор break может принимать необязательный числовой аргумент, который сообщает ему, выполнение какого количества вложенных структур необходимо завершить. Значением числового аргумента по умолчанию является 1, при котором завершается выполнение текущего цикла. Если в цикле используется оператор switch, то break/break 1 выходит только из конструкции switch.

\n"; break 1; /* Выход только из конструкции switch. */ case 10: echo "Итерация 10; выходим
\n"; break 2; /* Выход из конструкции switch и из цикла while. */ } } // другой пример for ($bar1 = -4; $bar1 < 7; $bar1++) { // проверка деления на ноль if ($bar1 == 0) { echo "Выполнение остановлено: деление на ноль невозможно."; break; } echo "50/$bar1 = ",50/$bar1,"
"; } ?>

Разумеется, иногда вы предпочли бы просто пропустить одну из итераций цикла, а не завершать полностью работу цикла, в таком случае это делается с помощью оператора continue.

Оператор continue

Для остановки обработки текущего блока кода в теле цикла и перехода к следующей итерации можно использовать оператор continue. От оператора break он отличается тем, что не прекращает работу цикла, а просто выполняет переход к следующей итерации.

Оператор continue также как и break может принимать необязательный числовой аргумент, который указывает на скольких уровнях вложенных циклов будет пропущена оставшаяся часть итерации. Значением числового аргумента по умолчанию является 1, при которой пропускается только оставшаяся часть текущего цикла.

"; continue; } echo "50/$bar1 = ",50/$bar1,"
"; } ?>

Обратите внимание: в процессе работы цикла было пропущено нулевое значение переменной $counter, но цикл продолжил работу со следующего значения.

Оператор goto

goto является оператором безусловного перехода. Он используется для перехода в другой участок кода программы. Место, куда необходимо перейти в программе указывается с помощью метки (простого идентификатора), за которой ставится двоеточие. Для перехода, после оператора goto ставится желаемая метка.

Простой пример использования оператора goto:

Оператор goto имеет некоторые ограничение на использование. Целевая метка должна находиться в том же файле и в том же контексте, это означает, что вы не можете переходить за границы функции или метода, а так же не можете перейти внутрь одной из них. Также нельзя перейти внутрь любого цикла или оператора switch. Но его можно использовать для выхода из этих конструкций (из циклов и оператора switch). Обычно оператор goto используется вместо многоуровневых break.

"; } echo "после цикла - до метки"; // инструкция не будет выполнена end: echo "После метки"; ?>