GOTO команда в PHP? - PullRequest
       55

GOTO команда в PHP?

5 голосов
/ 21 августа 2008

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

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

Ответы [ 7 ]

9 голосов
/ 21 августа 2008

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

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

6 голосов
/ 03 июля 2009

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

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

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

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

3 голосов
/ 21 августа 2008

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

1 голос
/ 21 августа 2008

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

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

// no need for label now
theItem = findItem(a, b, c);
0 голосов
/ 24 апреля 2013

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

0 голосов
/ 21 августа 2008

@ steveth45

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

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

0 голосов
/ 21 августа 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...