Команда GOTO в PHP?
-
09-06-2019 - |
Вопрос
До меня доходили слухи, что PHP планирует ввести команду goto.Что оно должно делать?
Я попробовал поискать, но ничего особенно информативного не нашел.Я понимаю, что это будет неGOTO 10
"-подобная команда...
Решение
Они не добавляют настоящий GOTO, а расширяют ключевое слово BREAK для использования статических меток.По сути, это будет способствовать повышению способности вырваться из выключатель вложенные операторы if.Вот пример концепции, который я нашел:
<?php
for ($i = 0; $i < 9; $i++) {
if (true) {
break blah;
}
echo "not shown";
blah:
echo "iteration $i\n";
}
?>
Конечно, как только «слух» GOTO распространился, ничто не могло помешать некоторым злым парням распространить дополнительный РОДОМ ИЗ шутить.Будьте в напряжении.
Смотрите также:
Другие советы
Меня всегда удивляет, насколько невероятно тупы PHP-дизайнеры.Если цель использования GOTO состоит в том, чтобы сделать вырыв из множества вложенных петлей более эффективными, есть лучший способ:Замеченные кодовые блоки и операторы разрыва, которые могут ссылаться на этикетки:
a: for (...) {
b: for (...) {
c: for (...) {
...
break a;
}
}
}
Теперь ясно, из какого цикла/блока следует выйти, и выход структурирован;с его помощью вы не сможете получить спагетти-код, как с настоящими готовыми программами.
Это старая, старая, старая идея.Проектирование хороших структур управления потоком управления было решено с 70 -х годов, и литература об этом давно написана.Теорема Бом-Якопини показал, что вы можете кодировать что-нибудь с помощью функционального вызова, если-то-эльсе и во время петли.На практике, чтобы вырваться из глубоко вложенных блоков, кодирование в стиле Бом-Якопини требовало дополнительных логических флагов («установите этот флаг, чтобы выйти из петли»), что было неуклюжим кодированием и неэффективным (вам не нужны такие флаги в ваших Внутренняя петля).С if-then-else, различные петли (в то время как, для) и блок разрыва, вы можете кодировать любой алгоритм без потери в эффективности.Почему люди не читают литературу, вместо того, чтобы копировать то, что делал?Гррр.
Конечно, я не программист PHP и не знаю, как будет выглядеть точная реализация GOTO в PHP, но вот мое понимание GOTO:
GOTO — это просто более явный оператор управления потоком, как и любой другой.Допустим, у вас есть несколько вложенных циклов, и вам нужно найти только одну вещь.Вы можете добавить условный оператор (или несколько), и когда условия выполняются правильно, вы можете использовать оператор GOTO, чтобы выйти из всех циклов (вместо использования оператора «break» на каждом уровне вложенности с условным оператором). для каждого.И да, я считаю, что традиционная реализация заключается в присвоении именованных меток, к которым оператор GOTO может перейти по имени.Вы можете сделать что-то вроде этого:
for(...) {
for (...) {
for (...) {
// some code
if (x) GOTO outside;
}
}
}
:outside
Это более простая (и более эффективная) реализация, чем без операторов GOTO.Эквивалентом будет:
for(...) {
for (...) {
for (...) {
// some code
if (x) break;
}
if(x) break;
}
if(x) break;
}
Во втором случае (что является обычной практикой) используются три условных оператора, что явно медленнее, чем наличие одного.Итак, из соображений оптимизации/упрощения вы можете использовать операторы GOTO в тесно вложенных циклах.
В примере, приведенном Стивен45 вместо этого вы можете использовать функцию:
function findItem(...) {
for (...) {
for (...) {
for (...) {
if (x) {
return theItem;
}
}
}
}
}
// no need for label now
theItem = findItem(a, b, c);
Это выглядит как сейчас в PHP 5.3, но еще не полностью документировано.Насколько я могу судить, он разделяет синтаксис перехода к C, поэтому его будет легко подобрать и использовать.Просто вспомните Дейкстру предупреждение и используйте его только при необходимости.
@steveth45
Мое эмпирическое правило заключается в том, что если у вас вложен код более чем на 3 уровня, вы делаете что -то не так.
Тогда вам не придется беспокоиться об использовании нескольких операторов прерывания или перехода :D
Eсть goto
в php -> http://php.net/manual/en/control-structures.goto.php, но я бы не стал его использовать, просто написал нормальный код...