Команда GOTO в PHP?

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

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

И на самом деле это в PHP5. И что он делает, это «просто goto».

Ira Baxter 04.03.2010 21:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
1
2 622
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

По этой причине вам не нужен GOTO. В моем ответе представлен более структурированный способ выражения выхода из циклов, который всегда работает и приводит к нулевой неэффективности. Goto для этого просто тупой. (Не о тебе размышления.)

Ira Baxter 04.03.2010 21:05

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

Ответ принят как подходящий

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

Я думаю, что это действительно сбивает с толку, потому что разрыв сам по себе выскакивает из цикла for, а не только из оператора if.

DisgruntledGoat 06.07.2009 18:41

@ steveth45

Мое практическое правило состоит в том, что если у вас есть вложенный код глубиной более трех уровней, вы делаете Что-то не так.

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

Я немного согласен, но иногда несколько уровней вложенных циклов неизбежны, и над ними не стоит насмехаться.

Christian 03.07.2009 13:27

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

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

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

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

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

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

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

Разве эта прервать помеченный блок, о которой вы упомянули, не является именно тем, что предлагается с этой новой функцией PHP? Прости меня, если я ошибаюсь

Felipe 13.03.2011 18:23

Какая новая функция? ИДТИ К? GOTO приведет вас к метке, размещенной в некоторой случайной части вашего кода. Разрыв на метку Только разрешает разрывы изнутри блока до выхода из блока.

Ira Baxter 13.03.2011 19:06

Что ж, я предполагаю, что вещь перерыв, которую вы упомянули, - это точно, которая, по слухам, будет представлена ​​в php6. Это не оживление GOTO.

Felipe 13.03.2011 23:17

@Felipe: Эта ветка посвящена тому, что GOTO «новый». Он уже в PHP5, и он работает как ... GOTO, что является моей жалобой. PHP6 может вводить другие вещи, возможно, даже разумно спроектированный перерыв, но это не было темой здесь.

Ira Baxter 14.03.2011 00:26

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

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