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 de goto
apó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 break
a goto
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.
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.