переменная php goto - PullRequest
       5

переменная php goto

3 голосов
/ 14 октября 2011

Интересно, возможно ли что-то подобное в PHP

$goto = 'end';
goto $goto;

когда я использую его, я получаю Parse error: syntax error, unexpected T_VARIABLE, expecting T_STRING.

Кроме того, как бы я сделал что-то подобное (учитывая, a() возвращает true или false)

a() or goto end;

в отличие от более длинной версии

if (!a()) goto end;

Большое спасибо!

  • чисто теоретически:)

Позднее редактирование: это, безусловно, вызвало большую реакцию. Я думаю, что упоминание двух наиболее обсуждаемых областей PHP (goto и eval) помогло получить некоторые сильные реакции. В любом случае, я хочу поблагодарить тех, кто приложил усилия, чтобы преодолеть свою «паранойю» (как кто-то сказал в комментариях). Я особенно хочу поблагодарить DaveRandom и Genesis за их ответы.

Просто чтобы прояснить ситуацию и успокоить сердца некоторых людей: я знаю причины не использовать goto. Но к каждому «правилу» есть исключения.

В заключение я хотел бы понять логику человека, который фактически проголосовал за вопрос . Разве это не правильный вопрос, не достаточно ли ясно, можно ли было легко ответить с помощью поисковой системы? Я думаю, у меня никогда не будет повода для твоего действия, "пользователь с отрицательным голосом":).

Ответы [ 4 ]

7 голосов
/ 14 октября 2011

Goto работает только так

10:
//something

goto 10;

или

end:
//something

goto end;

, но ваше невозможно

Да, я знаю, что использование gotoобескуражен, но ответ на реальный вопрос намного лучше, чем эти высказывания DO NOT USE GOTO GOTO IS EVIL

Приложение: eval goto

Вы вряд ли хотите сделать это:

$goto = 'end';

eval(<<<EOD

    goto $goto;
    return; 

    end: 

    echo 'end';
EOD
);

Демо

4 голосов
/ 14 октября 2011

Единственный способ увидеть это - это сделать:

$goto = 'end';
eval("goto $goto;");

ОДНАКО

  • Это может вообще не работать (у меня нет готовой версии 5.3 для тестирования)
  • eval() следует избегать любой ценой при 99,9% обстоятельств
  • То же самое goto. Это редкий ответ - если вы обнаружите, что используете goto, вам, вероятно, лучше изучить структуру своего кода.

В большинстве случаев люди используют goto, чтобы избежать беспорядочной структуры if-else, но есть кое-что (немного) более приятное, что вы можете сделать, что позволяет добиться того же: заключить блок кода в do {} while (FALSE);. Это означает, что вы можете позвонить break, чтобы пропустить оставшуюся часть кода и перейти прямо к концу. Они также могут быть вложенными, поэтому вы можете позвонить break 2; и т. Д., Чтобы перейти к нужной точке.

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

3 голосов
/ 14 октября 2011

Не делай этого с goto, даже если это возможно. Вместо этого сделайте так:

$goto = 'end';
$goto();

function end() {
  echo "This is run\n";
  exit();
}

Вы также можете сделать это в контексте объекта, используя $this->$goto() - иногда очень удобно.

1 голос
/ 14 октября 2011

Нет способа сделать это (с goto).Также вы не должны использовать goto ни для чего, кроме оставления (вложенных) циклов.
Все остальное, что может быть сделано с goto, может быть сделано с помощью "лучших" и менее запутанных методов и структур кода, поэтому вы должны предпочесть их!

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