До меня доходили слухи, что PHP планирует ввести команду «goto». Что он должен делать?
Я попробовал немного поискать, но не нашел ничего ужасно описательного. Я понимаю, что это не будет команда типа "GOTO 10" ...






Конечно, я не программист 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 в сильно вложенных циклах.
По этой причине вам не нужен GOTO. В моем ответе представлен более структурированный способ выражения выхода из циклов, который всегда работает и приводит к нулевой неэффективности. Goto для этого просто тупой. (Не о тебе размышления.)
Он выглядит, как и в настоящее время в PHP 5.3, но еще не полностью документирован. Насколько я могу судить, синтаксис goto совпадает с синтаксисом C, поэтому его должно быть легко подобрать и использовать. Просто запомните предупреждение Дейкстры и используйте его только при необходимости.
Они не добавляют настоящий GOTO, а расширяют ключевое слово BREAK для использования статических меток. По сути, это повысит возможность выхода из вложенных операторов if выключатель. Вот концептуальный пример, который я нашел:
<?php
for ($i = 0; $i < 9; $i++) {
if (true) {
break blah;
}
echo "not shown";
blah:
echo "iteration $i\n";
}
?>
Конечно, как только "слух" о GOTO распространился, не было ничего, что могло бы помешать некоторым злым парням распространить дополнительную шутку о РОДОМ ИЗ. Будьте настороже.
Смотрите также:
http://www.php.net/~derick/meeting-notes.html#adding-goto
Я думаю, что это действительно сбивает с толку, потому что разрыв сам по себе выскакивает из цикла for, а не только из оператора if.
@ steveth45
Мое практическое правило состоит в том, что если у вас есть вложенный код глубиной более трех уровней, вы делаете Что-то не так.
Тогда вам не нужно беспокоиться об использовании нескольких операторов break или goto: D
Я немного согласен, но иногда несколько уровней вложенных циклов неизбежны, и над ними не стоит насмехаться.
В примере, представленном Стивет45, вы можете вместо этого использовать функцию:
function findItem(...) {
for (...) {
for (...) {
for (...) {
if (x) {
return theItem;
}
}
}
}
}
// no need for label now
theItem = findItem(a, b, c);
Меня всегда удивляло, насколько тупы дизайнеры PHP. Если целью использования GOTO является выход из множества вложенных циклы более эффективны, есть лучший способ: маркированные блоки кода и операторы break, которые могут ссылаться на метки:
a: for (...) {
b: for (...) {
c: for (...) {
...
break a;
}
}
}
Теперь ясно, из какого цикла / блока нужно выйти, и выход структурирован; вы не можете получить спагетти-код с этим, как с настоящими goto.
Это старая, старая, старая идея. Разработка хорошего управления потоком управления конструкции решаются с 70-х годов, и литература по всему этому Давно написано. Теорема Бома-Якопини показала, что вы можете кодировать что угодно с помощью вызова функции, if-then-else и циклов while. На практике, чтобы вырваться из глубоко вложенных блоков, стиль Бома-Якопини кодирование требовало дополнительных логических флагов («установите этот флаг, чтобы выйти из цикла») который был неуклюжим и неэффективным в кодировании (вам не нужны такие флаги в вашем внутреннем цикле). С if-then-else различные циклы (while, for) и помеченный блоком, вы можете закодировать любой алгоритм без каких-либо потеря эффективности. Почему бы людям вместо этого не читать литературу копирования того, что сделал C? Grrr.
Разве эта прервать помеченный блок, о которой вы упомянули, не является именно тем, что предлагается с этой новой функцией PHP? Прости меня, если я ошибаюсь
Какая новая функция? ИДТИ К? GOTO приведет вас к метке, размещенной в некоторой случайной части вашего кода. Разрыв на метку Только разрешает разрывы изнутри блока до выхода из блока.
Что ж, я предполагаю, что вещь перерыв, которую вы упомянули, - это точно, которая, по слухам, будет представлена в php6. Это не оживление GOTO.
@Felipe: Эта ветка посвящена тому, что GOTO «новый». Он уже в PHP5, и он работает как ... GOTO, что является моей жалобой. PHP6 может вводить другие вещи, возможно, даже разумно спроектированный перерыв, но это не было темой здесь.
в php -> http://php.net/manual/en/control-structures.goto.php есть goto, но я бы не стал его использовать, просто напишите нормальный код ...
И на самом деле это в PHP5. И что он делает, это «просто goto».