Сведения о вопросе

Drake

17:29, 8th August, 2020

Теги

php   language-features   goto    

Гото команда в PHP?

Просмотров: 497   Ответов: 7

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

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



  Сведения об ответе

nYU

11:11, 28th August, 2020

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

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

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

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

http://www.php.net/~derick/meeting-notes.html#добавление-goto


  Сведения об ответе

darknet

05:50, 22nd August, 2020

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

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

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

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


  Сведения об ответе

crush

13:06, 6th August, 2020

Конечно, я не программист 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 в плотно вложенных циклах.


  Сведения об ответе

baggs

09:36, 9th August, 2020

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

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

// no need for label now
theItem = findItem(a, b, c);


  Сведения об ответе

PHPH

13:13, 11th August, 2020

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


  Сведения об ответе

9090

22:49, 24th August, 2020

@steveth45

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

Тогда вам не придется беспокоиться об использовании нескольких операторов break или goto :D


  Сведения об ответе

$DOLLAR

16:02, 14th August, 2020

есть goto в php - > http://php.net/manual/en/control-structures.goto.php, но я бы не использовал его, просто напишите нормальный код...


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться