Php

Php goto: goto | Руководство по PHP

PHP: goto — Manual

goto

(PHP 5 >= 5.3.0, PHP 7)

Изображение предоставлено » xkcd

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

Пример #1 Пример использования goto


<?php
goto a;
echo 'Foo';
 
a:
echo 'Bar';
?>

Результат выполнения данного примера:

Пример #2 Пример использования goto в цикле


<?php
for($i=0,$j=50; $i<100; $i++) {
  while($j--) {
    if($j==17) goto end; 
  }  
}
echo "i = $i";
end:
echo 'j hit 17';
?>

Результат выполнения данного примера:

Пример #3 Это не сработает


<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
  while($j--) {
    loop:
  }
}
echo "$i = $i";
?>

Результат выполнения данного примера:

Fatal error: 'goto' into loop or switch statement is disallowed in
script on line 2

Замечание:

Оператор goto доступен с PHP 5.3.

goto | Руководство по PHP

(PHP 5 >= 5.3.0, PHP 7)

Изображение предоставлено » xkcd

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

Пример #1 Пример использования goto


<?php
goto a;
echo 'Foo';
 
a:
echo 'Bar';
?>

Результат выполнения данного примера:

Пример #2 Пример использования goto в цикле


<?php
for($i=0,$j=50; $i<100; $i++) {
  while($j--) {
    if($j==17) goto end; 
  }  
}
echo "i = $i";
end:
echo 'j hit 17';
?>

Результат выполнения данного примера:

Пример #3 Следующий пример работать не будет


<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
  while($j--) {
    loop:
  }
}
echo "$i = $i";
?>

Результат выполнения данного примера:

Fatal error: 'goto' into loop or switch statement is disallowed in
script on line 2

Замечание:

Оператор goto доступен в PHP начиная с версии 5.3.

Вернуться к: Управляющие конструкции

PHP: break, continue и goto

break

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

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


<?php

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

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

continue

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

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


<?php

  for ($bar1 = -4; $bar1 < 7; $bar1++) {
    // проверка деления на ноль
    if ($bar1 == 0) {
      echo "Итерация пропущена из-за попытки деления на ноль.
"; continue; } echo "50/$bar1 = ",50/$bar1,"<br>"; } ?>

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

goto

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

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


<?php

  goto foo;       // указываем желаемую метку
  echo 'hello';
 
  foo:            // указываем место куда нужно перейти
  echo 'world';

?>

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


<?php

  for ($numb = 0; $numb < 100; $numb++) {
    if ($numb == 5) // если значение переменной $numb == 5
      goto end;     // переходим к выполнению инструкций следующих за меткой
	  
	echo "\$numb = $numb
"; } echo 'после цикла - до метки'; // инструкция не будет выполнена end: echo 'После метки'; ?>

С этой темой смотрят:

Является ли GOTO в PHP злым? PHP Lang

Недавно я узнал, что PHP 5.3 поддерживает новую конструкцию языка GOTO . Все знают, что он делает. Однако это не совсем традиционный GOTO , это просто ярлык перехода. Мне интересно узнать, является ли этот GOTO злом и подразумевает плохой код?

Если вы не программируете на ассемблере, GOTO всегда следует рассматривать так же, как и жилет для жизни самолетов: хорошо иметь их в наличии, но если вам нужно их использовать, это означает, что у вас большие проблемы.

Не могу поверить, что никто не писал это 🙂

Конечно, PHP не компилируется … Может, хищник будет преследовать вас при каждом посещении вашего сайта?

Плохая структуризация кода зла, независимо от структуры управления, которую вы используете.

Я лично предпочитаю goto, который очищает поток программы, чтобы «управлять переменными» и вложенным «if», что косвенно приведет к одной и той же ветви в коде.

Итак, просто напишите две версии (с GOTO и без нее) и посмотрите, какой из них легче понять. Тогда выбор прост.

Я нахожусь в меньшинстве (в настоящее время), но я считаю, что ограничения, связанные с конструкцией goto PHP, делают очень полезный инструмент:

http://adamjonrichardson.com/2012/02/06/long-live-the-goto-statement/

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

Я думаю, что это самая важная часть справочной страницы PHP и отсутствует здесь:

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

ИМХО это очень сильно отличается от устаревших стилей BASIC .

Являются ли орудия злыми? Оба могут быть использованы для добра или зла. Я бы сказал, что легче писать хороший код без goto, чем с.

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

Будучи инженером-программистом, я в основном работаю над «мэйнфреймами» и «большими корпоративными серверами» … И наш ежедневный язык (я имею в виду один из 95% нашего базового кода) – это Cobol, который широко использует GOTO.

Это использование не означает, что код плохой. Это просто означает, что этот инструмент (GOTO) был правильным в тот момент, когда были написаны программы.

Чтобы ответить на вопрос Кайтсули, я думаю, что это может быть полезным инструментом при написании PHP-скриптов. С другой стороны, уже почти десять лет без него было достигнуто множество сценариев. Кроме того, это противоречит эволюции PHP с более объектно-ориентированными функциями.

ИМХО, это нехорошо и не плохо для кода: хорошие программы по-прежнему будут хорошими, а «программы ужасов» будут хуже … Единственный вопрос: «Зачем добавлять GOTO через 10 лет после подтверждения, что это не нужно? ».

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

Когда у вас есть неструктурированный код, прыгающий сюда, вы только что обнаружили зло, исходящее из заявления GOTO. Почти всегда лучше избегать этого. Может быть, раз каждые 100 000 строк есть место, где предложение GOTO упрощает LOT, код не является злым, но если вы не уверены, тогда вам следует избегать GOTO.

Надеюсь это поможет.

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

Например, возвращение в середине функции – это GOTO до конца, поэтому я избегаю их и использую только один возврат в каждой функции только в конце.

Другие языки, такие как Vb.Net (возможно, другие), позволяют делать Exit For, Exit While, breaks и т. Д., Которые также неструктурируют код, и я думаю, этого следует избегать.

иногда (я имею в виду в 0,01% случаев), это полезно, например, когда у вас длинный длинный скрипт, и вы хотите протестировать некоторые блоки. но никогда не оставляйте его в своем финальном сценарии

Я использовал GOTO, когда писал сценарий для работы в режиме cli. Это спасает мою жизнь.

GOTO следует удалить с языка. Если у кого-то есть необходимость «безоговорочно передать управление», тогда им нужно вернуться в школу, чтобы изучить Структурированное программирование 101

PHP 5.6 и PHP 7 на русском: goto

goto

(PHP 5 >= 5.3.0, PHP 7)

Изображение предоставлено » xkcd

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

Пример #1 Пример использования goto


<?php
goto a;
echo 'Foo';
 
a:
echo 'Bar';
?>

Результат выполнения данного примера:

Пример #2 Пример использования goto в цикле


<?php
for($i=0,$j=50; $i<100; $i++) {
  while($j--) {
    if($j==17) goto end; 
  }  
}
echo "i = $i";
end:
echo 'j hit 17';
?>

Результат выполнения данного примера:

Пример #3 Следующий пример работать не будет


<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
  while($j--) {
    loop:
  }
}
echo "$i = $i";
?>

Результат выполнения данного примера:

Fatal error: 'goto' into loop or switch statement is disallowed in
script on line 2

Замечание:

Оператор goto доступен в PHP начиная с версии 5.3.

Тег — Портал программирования

(PHP 5 >= 5.3.0, PHP 7)

Изображение предоставлено » xkcd

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

Пример #1 Пример использования goto

<?php
goto a;
echo 'Foo';
 
a:
echo 'Bar';
?>
Результат выполнения данного примера:

Bar

 

Пример #2 Пример использования goto в цикле

<?php
for($i=0,$j=50; $i<100; $i++) {
  while($j--) {
    if($j==17) goto end; 
  }  
}
echo "i = $i";
end:
echo 'j hit 17';
?>
Результат выполнения данного примера:

j hit 17

 

Пример #3 Следующий пример работать не будет

<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
  while($j--) {
    loop:
  }
}
echo "$i = $i";
?>

 

Результат выполнения данного примера:

Fatal error: 'goto' into loop or switch statement is disallowed in
script on line 2

Замечание:

Оператор goto доступен в PHP начиная с версии 5.3.

PHP: Изолирование от HTML — Manual

Изолирование от HTML

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


<p>Это будет проигнорировано PHP и отображено браузером.</p>
<?php echo 'А это будет обработано.'; ?>
<p>Это тоже будет проигнорировано PHP и отображено браузером.</p>

Это работает так, как и ожидается, потому что когда интерпретатор PHP встречает закрывающие теги ?>,
он просто начинает выводить все что найдет (за исключением сразу следующего
символа перевода строки — смотрите раздел
разделение инструкций)
пока не встретит другой открывающий тег за исключением случая с
содержащимся внутри кода условным оператором, в котором интерпретатор определяет результат
условия перед принятием решения что пропустить.
Ознакомьтесь со следующим примером.

Использование структур с условиями

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


<?php if ($expression == true): ?>
  Это будет отображено, если выражение истинно.
<?php else: ?>
  В ином случае будет отображено это.
<?php endif; ?>

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

При выводе больших блоков текста выход из режима синтаксического разбора PHP
обычно более эффективен, чем отправка текста с помощью функций
echo или print.

В PHP 5, существует до пяти различных пар тегов, которые могут быть использованы
для обозначения PHP-кода, в зависимости от того, как был сконфигурирован PHP.
Из них только две <?php ?> и
<script language="php"> </script> доступны всегда.
Также, начиная с PHP 5.4.0, третьей, доступной всегда, парой тегов является <?= ?>.

Другими двумя являются короткие теги и теги в стиле ASP,
которые могут быть включены или выключены в конфигурационном файле php.ini.
Хотя короткие теги и теги в стиле ASP могут быть
удобны, они не так переносимы, как длинные версии, и поэтому не рекомендуются.

Замечание:

Кроме того, если вы намереваетесь вставлять PHP-код в XML или XHTML,
чтобы соответствовать XML стандартам, вам следует использовать форму
<?php ?>.

В PHP 7 удалена поддержка тегов ASP и
<script language="php">. Так что мы рекомендуем использовать только
<?php ?> и <?= ?> для максимальной
совместимости и переносимости.

Пример #2 Открывающие и закрывающие теги PHP


1.  <?php echo 'если вы хотите хранить код PHP в документах XHTML или XML,
                то используйте эти теги'; ?>

2. Вы можете использовать короткий 'echo'-тег чтобы <?= 'напечатать эту строку' ?>.
    Он всегда разрешен начиная с PHP 5.4.0. Этот тег эквивалентен такому коду
    <?php echo 'напечатать эту строку' ?>.

3.  <? echo 'этот код с короткими тегами, но он будет работать только если '.
                'включена опция "short_open_tag"'; ?>

4.  <script language="php">
        echo 'некоторые редакторы (например, FrontPage) не
              любят инструкции обработки с этими тегами';
    </script>
    Поддержка такого синтаксиса удалена в PHP 7.0.0.

5.  <% echo 'Также вы можете использовать теги в ASP стиле'; %>
    Код с такими тегами <%= $variable; %> является сокращением от <% echo $variable; %>
    Поддержка обоих этих синтаксисов удалена в PHP 7.0.0.

Короткие теги (третий пример) доступны, только когда они включены с помощью
директивы short_open_tag в
конфигурационном файле php.ini, либо если PHP был скомпилирован с опцией
—enable-short-tags.

ASP-теги (пятый пример) доступны, только
когда они включены с помощью директивы asp_tags
в конфигурационном файле php.ini. В PHP 7.0.0 их поддержка удалена.

Замечание:

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

Замечание:

В PHP 5.2 и более ранних версиях парсер не позволял файлам содержать только
один открытый тег <?php. Это было разрешено, начиная
с версии PHP 5.3 при наличии одного или более пробела после открывающего тега.

Замечание:

Начиная с PHP 5.4 короткий тег echo <?= всегда распознается и действует,
несмотря на значение опции short_open_tag.

Является ли GOTO в PHP злом?

Переполнение стека

  1. Около
  2. Продукты

  3. Для команд
  1. Переполнение стека
    Общественные вопросы и ответы

  2. Переполнение стека для команд
    Где разработчики и технологи делятся частными знаниями с коллегами

  3. Вакансии
    Программирование и связанные с ним технические возможности карьерного роста

  4. Талант
    Нанимайте технических специалистов и создавайте свой бренд работодателя

  5. Реклама
    Обратитесь к разработчикам и технологам со всего мира

  6. О компании

.

Как я могу декодировать php-код с помощью оператора goto?

Переполнение стека

  1. Около
  2. Продукты

  3. Для команд
  1. Переполнение стека
    Общественные вопросы и ответы

  2. Переполнение стека для команд
    Где разработчики и технологи делятся частными знаниями с коллегами

  3. Вакансии
    Программирование и связанные с ним технические возможности карьерного роста

  4. Талант
    Нанимайте технических специалистов и создавайте свой бренд работодателя

  5. Реклама
    Обратитесь к разработчикам и технологам со всего мира

  6. О компании

Загрузка…

.

Каковы допустимые варианты использования goto в PHP?

Переполнение стека

  1. Около
  2. Продукты

  3. Для команд
  1. Переполнение стека
    Общественные вопросы и ответы

  2. Переполнение стека для команд
    Где разработчики и технологи делятся частными знаниями с коллегами

  3. Вакансии
    Программирование и связанные с ним технические возможности карьерного роста

  4. Талант
    Нанимайте технических специалистов и создавайте свой бренд работодателя

  5. Реклама
    Обратитесь к разработчикам и технологам со всего мира

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *