Por que o GOTO foi incluído no PHP 5? [fechadas]


8

Descobri há algum tempo que a palavra-chave de controle GOTO foi introduzida no PHP 5.3.0.

http://php.net/manual/en/control-structures.goto.php

Por que isso aconteceu?

Quais são os objetivos do design da linguagem por trás disso?

A comunidade de desenvolvedores de PHP pediu isso?


10
Não vejo realmente nenhum problema com o goto. Eu realmente não. No entanto, as pessoas parecem detestá-lo, mesmo que quase nunca seja usado, mesmo nos casos em que simplificaria o código. Sim, tem bons usos, independentemente de você estar acostumado a ler gotona fonte ou não. Se eles são vistos frequentemente em código idiomático ou não, é outra coisa. Goto não causa danos no entanto.
Zxcdw 19/12/12

7
Máquinas de estado finito são um pouco mais fáceis de codificar quando você tem goto.
precisa

Respostas:


22

A pessoa responsável fornece o motivo para adicioná-lo nesta postagem do blog .

[O] projeto em que eu estava trabalhando (e pode retomar algum dia) era um construtor de sites baseado em fluxo de trabalho [...] para criar sites dinâmicos sem conhecer uma linguagem de programação. Você cria todas as metainformações sobre como o site deve ser executado, e o construtor de sites “compila” isso no código PHP que será executado no servidor real.

Isso pode ser feito sem o GOTO, mas a lógica resultante para os bits particularmente complexos da lógica de negócios se torna muito mais simples.

Na defesa do PHP, ele só permite que você pule para rótulos dentro de um escopo limitado, o que limita o dano que pode ser causado.

(Você também pode argumentar que, dada a maneira como o PHP aparentemente absorveu todas as construções de todas as linguagens de programação já inventadas, a adição de gotoera simplesmente inevitável)


19
Então foi feito para um projeto em que ele não trabalha mais ... Doce.
Robert Harvey

Sim capitão! every construct from every programming language ever invented! ...Ao infinito e além! (e acho que isso é o que costumava dizer de Perl 5 ... Estou tão orgulhoso deste sempre crescente pequena bolha de absurdo chamado PHP)
ZJR

13

Em um nível mais baixo, o PHP tinha gotodesde o PHP 4. Com o PHP 4, o intérprete foi refeito e o Zend Engine foi introduzido, que inclui um compilador que compila até "opcodes" de baixo nível, que são entregues a um executor.

Nesse nível uma operação de salto é usado para todos if, switchou quaisquer instruções de loop. Com o PHP 5.3, decidiu-se exportar isso sob o nome de gotoapós uma longa discussão.

Os principais motivos foram:

  • Isso pode ser feito sem nenhum custo (já o tínhamos internamente)
  • Pode ajudar ao escrever geradores de código
  • Às vezes, pode ajudar a limpar o código de manipulação de erros.

Os dois primeiros itens podem não precisar de explicação e a terceira parte trata de situações como esta:

 function do() {
     $lock = $acquire_lock...)
     if (!do_something()) {
         goto cleanup
     }
     if (!do_more()) {
          goto cleanup;
     }
  cleanup:
  free_lock($lock);

É claro que você tem poucas situações desse tipo no PHP, pois o PHP possui um sistema de coleta de lixo contado como referência que liberará previsivelmente essas variáveis ​​e recursos associados. No entanto existem tais situações onde os desenvolvedores seja duplicado o código-se limpo várias vezes ou abuso d do { } while (0);com breaka gotoemulação.

Para evitar o uso indevido, a implementação foi limitada de uma maneira que você não pode pular nos loops. Portanto, "abuso" no caminho do famoso dispositivo de Duff não será possível.

No final, o PHP está sendo desenvolvido para resolver problemas, ele não está totalmente protegendo você de disparar com seu próprio pé, você pode abusar de muitos recursos de maneiras muito piores que essa limitada goto. Portanto, a conclusão foi que existem casos extremos onde é útil e pode resolver problemas.


2
ir para a limpeza? A sério? Por que não apenas implementar uma try-finallyconstrução real ? (O PHP tem um?)
Mason Wheeler

3
@MasonWheeler O PHP ficou finallyrecentemente, e depois disso goto.
precisa

3
Bem, existem pessoas que não gostam de exceções, mas vão. É um mundo livre ;-)
Johannes

7
E aliás. sendo o Mestre Lançamento do PHP 5.3 tomo a total responsabilidade por esta decisão :-)
Johannes

5

Pode-se escrever código incorreto em qualquer idioma. Ter gotoo idioma não significa que ele seja ruim.

Considere estruturas existentes em várias línguas - pausa , continue, next, último , throw. Mesmo switch Essas são todas as formas de uma passagem computada que vão de um nível de escopo para o mesmo ou mais alto nível de escopo.

O problema com o goto é quando ele entra em um nível mais profundo de escopo ou salta os quadros da pilha.

Observaremos o Exemplo 3 no documento vinculado da pergunta:

<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
  while($j--) {
    loop:
  }
}
echo "$i = $i";
?>

Isso não funcionará porque gotoestá tentando pular para um nível mais profundo de escopo.

Não há nada de errado com várias formas de goto restrito, seja a palavra-chave chamada goto ou outro nome derivado. As alternativas (condicionais feias para loops) podem ser piores. Como é, usar goto simplifica o

Pessoalmente, não gosto do exemplo dado como exemplo nº 1

<?php
goto a;
echo 'Foo';

a:
echo 'Bar';
?>

No entanto, isso não causa problemas com o idioma além da necessidade de aplicar alguma forma de experiência de aprendizado corporal ao desenvolvedor que intencionalmente escreve código como este.


4
+1: especialmente "ter que ir para o idioma não significa que o idioma esteja ruim"
Deco
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.