Команда GOTO в PHP?

Я слышал слухи, что PHP планирует ввести команду «goto». Что он должен делать?

Я попытался немного поискать, но не нашел ничего ужасно описательного. Я понимаю, что это не будет команда « GOTO 10 » …

Related of "Команда GOTO в PHP?"

Они не добавляют реального GOTO, а расширяют ключевое слово BREAK, чтобы использовать статические метки. В принципе, это будет усиливать способность выходить из переключаемых вложенных операторов if. Вот пример концепции, который я нашел:

 <?php for ($i = 0; $i < 9; $i++) { if (true) { break blah; } echo "not shown"; blah: echo "iteration $i\n"; } ?> 

Конечно, после того, как «слух» GOTO вышел, не было ничего, что могло бы остановить некоторых злых парней, чтобы распространять дополнительную шутку COMEFROM . Будьте на цыпочках.

Смотрите также:

http://www.php.net/~derick/meeting-notes.html#adding-goto

Я всегда удивляюсь, насколько невероятно глупые разработчики 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 , но я бы не использовал его, просто напишу обычный код …