Вопрос

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

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

Это было полезно?

Решение

Они не добавляют настоящий 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

Другие советы

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

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

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

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

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

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

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

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

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

@steveth45

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top