GOTO команда в PHP?

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

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

21.08.2008 05:57:59
И на самом деле это в PHP5. И то, что он делает, это "просто идти".
Ira Baxter 4.03.2010 18:03:59
7 ОТВЕТОВ
РЕШЕНИЕ

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

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

Конечно, как только «слух» GOTO вышел, ничто не могло помешать некоторым злым парням распространять дополнительную шутку COMEFROM . Будьте в тонусе.

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

http://www.php.net/~derick/meeting-notes.html#adding-goto

9
20.02.2017 13:59:00
Я думаю, что это действительно сбивает с толку, потому что сам по себе разрыв будет выпадать из цикла for, а не только из оператора if.
DisgruntledGoat 6.07.2009 14:41:05

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

3
21.08.2008 06:11:30
Вам не нужно GOTO по этой причине. Смотрите мой ответ для более структурированного способа выразить разрыв циклов, который всегда работает и вводит нулевую неэффективность. Гото для этого просто тупой. (Не отражение на вас.)
Ira Baxter 4.03.2010 18:05:27

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

0
21.08.2008 06:14:40

@ steveth45

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

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

0
21.08.2008 06:16:43
Я немного согласен, но иногда несколько уровней вложенных циклов неизбежны и не должны насмехаться над ними.
Christian 3.07.2009 09:27:05

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

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

// no need for label now
theItem = findItem(a, b, c);
1
23.05.2017 11:53:20

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

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

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

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

6
13.03.2011 16:05:26
Разве это не то, что вы упомянули в блоке «разбить на метку» , что именно вы предлагаете с этой новой функцией PHP? Прости меня, если я ошибаюсь
Felipe Almeida 13.03.2011 15:23:38
Какая новая функция? ПЕРЕЙТИ К? GOTO приведет вас к метке, размещенной в некоторой случайной части вашего кода. Разрыв до метки допускает только разрывы внутри блока до выхода из блока.
Ira Baxter 13.03.2011 16:06:25
Ну, я думаю, что упомянутое вами слово « прорваться к лейблу» - именно то, что, по слухам, будет представлено в php6. Это не возрождает GOTO.
Felipe Almeida 13.03.2011 20:17:21
@Felipe: эта тема о том, что GOTO "новый". Его уже в PHP5, и он работает как ... GOTO, что моя жалоба. PHP6 может вводить другие вещи, может быть, даже разумно разработанный прорыв, но это не было темой здесь.
Ira Baxter 13.03.2011 21:26:57

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

0
24.04.2013 10:55:13