До меня дошли слухи, что PHP планирует ввести команду "goto". Что он должен делать?
Я попытался немного поискать, но не нашел ничего ужасно описательного. Я понимаю, что это не будет GOTO 10
"-подобная команда ...
Они не добавляют настоящий GOTO, но расширяют ключевое слово BREAK для использования статических меток. В основном, это будет повышение способности вырваться из переключателя вложенного если заявления. Вот пример концепции, которую я нашел:
<?php
for ($i = 0; $i < 9; $i++) {
if (true) {
break blah;
}
echo "not shown";
blah:
echo "iteration $i\n";
}
?>
Конечно, как только «слух» GOTO вышел, ничто не могло помешать некоторым злым парням распространять дополнительную шутку COMEFROM . Будьте в тонусе.
Смотрите также:
Конечно, я не программист 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 в тесно вложенных циклах.
Это выглядит , как это в настоящее время в 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);
Я всегда удивляюсь, насколько невероятно глупы PHP-дизайнеры. Если цель использования GOTO состоит в том, чтобы сделать разрывание многократных вложенных циклов более эффективным, есть лучший способ: помеченные блоки кода и операторы разбивки, которые могут ссылаться на метки:
a: for (...) {
b: for (...) {
c: for (...) {
...
break a;
}
}
}
Теперь ясно, какой цикл / блок выйти, и выход структурирован; Вы не можете получить код спагетти с этим, как вы можете с реальным gotos.
Это старая, старая, старая идея. Разработка хороших структур управления потоком управления решалась с 70-х годов, и литература по всем этим давно написана. Теорема Бома-Якопини показала, что вы можете кодировать все что угодно с помощью вызова функций, if-then-else и while. На практике, чтобы вырваться из глубоко вложенных блоков, для кодирования в стиле Бома-Якопини потребовались дополнительные логические флаги («установить этот флаг, чтобы выйти из цикла»), что было неуклюжим кодированием и неэффективно (вам не нужны такие флаги в вашем внутренний цикл). С помощью if-then-else, различных циклов (while, for) и блока разрыва на метку вы можете кодировать любой алгоритм без потери эффективности. Почему люди не читают литературу вместо того, чтобы копировать то, что делал С? Хмм.
есть goto
в php -> http://php.net/manual/en/control-structures.goto.php , но я бы не стал его использовать, просто пишу нормальный код ...