Команда GOTO в PHP?

Ответы выше, теперь устарели из-за нового синтаксиса конвейера. Ниже распечатываются переменные среды.

script {
        sh 'env > env.txt'
        String[] envs = readFile('env.txt').split("\r?\n")

        for(String vars: envs){
            println(vars)
        }
    }
5
задан Sled 5 December 2014 в 15:03
поделиться

6 ответов

Они не добавляют реальный GOTO, но расширяют ключевое слово ПОВРЕЖДЕНИЯ для использования статических маркировок. В основном это будет улучшать способность убежать из переключателя, вложенного если операторы. Вот пример понятия, который я нашел:

<?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

9
ответ дан 18 December 2019 в 08:33
поделиться

Предоставленный, я не PHP программист, и я не знаю то, на что точная реализация PHP GOTO будет похожа, но здесь является моим пониманием GOTO:

GOTO является просто более явным оператором управления потоком как любой другой. Скажем, у Вас есть некоторые вложенные циклы, и только необходимо найти одну вещь. Можно вставить условный оператор (или несколько) и когда условия соблюдают правильно, можно использовать Оператор перехода для выхода из всех циклов, (вместо того, чтобы иметь оператор 'повреждения' на каждом уровне вложения с условным оператором для каждого. И да, я полагаю, что традиционная реализация должна назвать маркировки, к которым может перейти Оператор перехода по имени. Можно сделать что-то вроде этого:

for(...) {
    for (...) {
        for (...) {
        // some code
        if (x) GOTO outside;
        }
    }
} 
:outside

Это - более простое (и более эффективный) реализация, чем без Операторов перехода. Эквивалент был бы:

for(...) {
    for (...) {
        for (...) {
            // some code
            if (x) break;
        }
        if(x) break;
    }
    if(x) break;
} 

Во втором случае (который является обычной практикой) существует три условных оператора, который, очевидно, медленнее, чем просто наличие того. Так, по причинам оптимизации/упрощения Вы могли бы хотеть использовать Операторы перехода в плотно вложенных циклах.

3
ответ дан 18 December 2019 в 08:33
поделиться

В примере, данном steveth45, можно использовать функцию вместо этого:

function findItem(...) {
  for (...) {
    for (...) {
      for (...) {
        if (x) {
          return theItem;
        }
      }
    }
  }
}

// no need for label now
theItem = findItem(a, b, c);
1
ответ дан 18 December 2019 в 08:33
поделиться

Похоже, что это в настоящее время находится в PHP 5.3, но еще не полностью документируется. Из того, что я могу сказать, что это совместно использует свой goto синтаксис с C, таким образом, должно быть легко взять и использовать. Просто помните предупреждение Dijkstra и используйте его только при необходимости.

0
ответ дан 18 December 2019 в 08:33
поделиться

@steveth45

Мое эмпирическое правило - то, что при вложении кода больше чем 3 уровня глубоко Вы делаете что-то не так.

Затем Вы не должны волноваться об использовании нескольких операторов завершения или goto :D

0
ответ дан 18 December 2019 в 08:33
поделиться

Я всегда удивлялся тому, насколько невероятно тупы дизайнеры PHP. Если целью использования GOTO является выход из множества вложенных циклы более эффективны, есть лучший способ: маркированные блоки кода и операторы break, которые могут ссылаться на метки:

a:  for (...) {
    b:  for (...) {
         c: for (...) {
               ...
               break a;
           }
       }
   }

Теперь ясно, из какого цикла / блока нужно выйти, и выход структурирован; вы не можете получить спагетти-код с этим, как с настоящими goto.

Это старая, старая, старая идея. Разработка хорошего управления потоком управления конструкции решаются с 70-х годов, и литература по всему этому давно написано. Теорема Бома-Якопини показала, что вы можете кодировать что угодно с помощью вызова функции, if-then-else и циклов while. На практике, чтобы вырваться из глубоко вложенных блоков, стиль Бома-Якопини кодирование требовало дополнительных логических флагов («установите этот флаг, чтобы выйти из цикла») который был неуклюжим и неэффективным (вам не нужны такие флаги в вашем внутреннем цикле). С if-then-else различные циклы (while, for) и помеченный блок, вы можете закодировать любой алгоритм без каких-либо потеря эффективности. Почему бы людям вместо этого не читать литературу копирования, что сделал C? Grrr.

6
ответ дан 18 December 2019 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: