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?
php
language-design
control-structures
goto
structured-programming
Tulains Córdova
fonte
fonte
goto
na 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.goto
.Respostas:
A pessoa responsável fornece o motivo para adicioná-lo nesta postagem do blog .
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
goto
era simplesmente inevitável)fonte
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)Em um nível mais baixo, o PHP tinha
goto
desde 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
,switch
ou quaisquer instruções de loop. Com o PHP 5.3, decidiu-se exportar isso sob o nome degoto
após uma longa discussão.Os principais motivos foram:
Os dois primeiros itens podem não precisar de explicação e a terceira parte trata de situações como esta:
É 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);
combreak
agoto
emulaçã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.fonte
try-finally
construção real ? (O PHP tem um?)finally
recentemente, e depois dissogoto
.Pode-se escrever código incorreto em qualquer idioma. Ter
goto
o idioma não significa que ele seja ruim.Considere estruturas existentes em várias línguas - pausa ,
continue
,next
, último ,throw
. Mesmoswitch
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:
Isso não funcionará porque
goto
está 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
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.
fonte