Pergunta

Ouvi rumores de que o PHP está planejando introduzir um comando “goto”.O que deveria estar fazendo?

Tentei pesquisar um pouco, mas não encontrei nada muito descritivo.Eu entendo que não será um "GOTO 10"-como comando...

Foi útil?

Solução

Eles não estão adicionando um GOTO real, mas estendendo a palavra-chave BREAK para usar rótulos estáticos.Basicamente, estará aumentando a capacidade de sair do trocar instruções if aninhadas.Aqui está o exemplo de conceito que encontrei:

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

É claro que, uma vez que o "boato" GOTO foi divulgado, não havia nada que impedisse alguns bandidos de propagar uma mensagem adicional. VEM DE ONDE piada.Esteja alerta.

Veja também:

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

Outras dicas

Sempre fico surpreso com o quão incrivelmente burros são os designers de PHP.Se o objetivo de usar os Gotos é tornar os loops multiplicados mais eficientes, há uma maneira melhor:Blocos de código rotulados e declarações de interrupção que podem referenciar rótulos:

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

Agora está claro qual loop/bloco sair, e a saída está estruturada;você não pode obter código espaguete com isso como acontece com gotos reais.

Esta é uma ideia muito, muito antiga.Projetar boas estruturas de gerenciamento de fluxo de controle foi resolvido desde os anos 70, e a literatura sobre tudo isso é escrita há muito tempo.O teorema de Bohm-Jacopini mostrou que você poderia codificar qualquer coisa com a chamada de função, se-then-else e enquanto loops.Na prática, para sair de blocos profundamente aninhados, a codificação do estilo Bohm-Jacopini exigia bandeiras booleanas extras ("Defina essa bandeira para sair do loop"), que era de maneira desajeitada e ineficiente (você não quer tais sinalizadores em seu laço interno).Com o IF-Then-Else, vários loops (enquanto, para) e o bloco de quebra-a-ração, você pode codificar qualquer algoritmo sem perda de eficiência.Por que as pessoas não leem a literatura, em vez de copiar o que C fez?Grr.

É verdade que não sou um programador PHP e não sei como será a implementação exata do GOTO no PHP, mas aqui está o meu entendimento do GOTO:

GOTO é apenas uma instrução de controle de fluxo mais explícita como qualquer outra.Digamos que você tenha alguns loops aninhados e só precise encontrar uma coisa.Você pode colocar uma instrução condicional (ou várias) e quando as condições forem atendidas corretamente, você pode usar uma instrução GOTO para sair de todos os loops (em vez de ter uma instrução 'break' em cada nível de aninhamento com uma instrução condicional para cada.E sim, acredito que a implementação tradicional é ter rótulos nomeados para os quais a instrução GOTO possa saltar pelo nome.Você pode fazer algo assim:

for(...) {
    for (...) {
        for (...) {
        // some code
        if (x) GOTO outside;
        }
    }
} 
:outside

Esta é uma implementação mais simples (e mais eficiente) do que sem instruções GOTO.O equivalente seria:

for(...) {
    for (...) {
        for (...) {
            // some code
            if (x) break;
        }
        if(x) break;
    }
    if(x) break;
} 

No segundo caso (que é uma prática comum), existem três declarações condicionais, o que é obviamente mais lento do que apenas ter uma.Portanto, por motivos de otimização/simplificação, você pode querer usar instruções GOTO em loops bem aninhados.

No exemplo dado por Steve45 você pode usar uma função:

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

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

Isto visual como se estivesse atualmente no PHP 5.3, mas ainda não esteja totalmente documentado.Pelo que posso dizer, ele compartilha sua sintaxe goto com C, por isso deve ser fácil de aprender e usar.Basta lembrar de Dijkstra aviso e use-o somente quando necessário.

@steveth45

Minha regra geral é que, se você tiver aninhado o código com mais de 3 níveis de profundidade, estará fazendo algo errado.

Então você não precisa se preocupar em usar várias instruções break ou ir para: D

existe um goto em php -> http://php.net/manual/en/control-structures.goto.php, mas eu não usaria, apenas escreveria código normal...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top