Я слышал слухи, что 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 вышел, не было ничего, что могло бы остановить некоторых злых парней, чтобы распространять дополнительную шутку COMEFROM . Будьте на цыпочках.
Смотрите также:
Я всегда удивляюсь, насколько невероятно глупые разработчики PHP. Если целью использования GOTO является более эффективный выход из многократно вложенных циклов, лучший способ: помеченные блоки кода и инструкции break, которые могут ссылаться на метки:
a: for (...) { b: for (...) { c: for (...) { ... break a; } } }
Теперь ясно, какой цикл / блок выйдет, а выход структурирован; вы не можете получить код спагетти с этим, как вы можете с настоящими gotos.
Это старая, старая, старая идея. Проектирование хороших структур управления потоком управления было решено с 70-х годов, и литература по всему этому давно написана. Теорема Бома-Якопини показала, что вы можете кодировать что-либо с вызовом функции if-then-else и while loop. На практике, чтобы вырваться из глубоко вложенных блоков, кодировка стиля Бома-Якопини требовала дополнительных булевых флагов («установить этот флаг, чтобы выйти из цикла»), который был неуклюжим кодированием мудрым и неэффективным (вы не хотите, чтобы такие флаги в вашем внутренний цикл). С if-then-else, различными циклами (while, for) и break-to-labeled, вы можете кодировать любой алгоритм без потери эффективности. Почему люди не читают литературу, а не копируют то, что сделал C? Хмм.
Конечно, я не программист на PHP, и я не знаю, как будет выглядеть точная реализация PHP GOTO, но вот мое понимание 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 в сильно вложенных циклах.
Похоже, что он в настоящее время находится в PHP 5.3, но пока не полностью документирован. Из того, что я могу сказать, он делится своим синтаксисом goto с C, поэтому его легко подбирать и использовать. Просто помните предупреждение Дейкстры и используйте его только в случае необходимости.
@ steveth45
Мое правило состоит в том, что если у вас вложенный код более 3 уровней, вы делаете что-то неправильно.
Тогда вам не нужно беспокоиться об использовании нескольких инструкций break или goto: D
В примере, приведенном steveth45, вы можете использовать функцию:
function findItem(...) { for (...) { for (...) { for (...) { if (x) { return theItem; } } } } } // no need for label now theItem = findItem(a, b, c);
есть goto
в php -> http://php.net/manual/en/control-structures.goto.php , но я бы не использовал его, просто напишу обычный код …