En un nivel inferior, PHP tenía goto
desde PHP 4. Con PHP 4 se rehizo el intérprete y se introdujo el Zend Engine, que incluye un compilador que se compila en "códigos de operación" de bajo nivel que se entregan a un ejecutor.
En ese nivel, se utiliza una operación de salto para todos if
, switch
o cualquier declaración de bucle. Con PHP 5.3 se decidió exportar eso bajo el nombre de goto
después de una larga discusión.
Las razones principales fueron:
- Se puede hacer sin ningún costo (de todos modos ya lo teníamos internamente)
- Puede ayudar al escribir generadores de código
- A veces puede ayudar limpiar el código de manejo de errores.
Es posible que los dos primeros elementos no necesiten explicación, y la tercera parte trata sobre situaciones como esta:
function do() {
$lock = $acquire_lock...)
if (!do_something()) {
goto cleanup
}
if (!do_more()) {
goto cleanup;
}
cleanup:
free_lock($lock);
Por supuesto, tiene pocas situaciones de este tipo en PHP, ya que PHP tiene un sistema de recolección de basura contado por referencia que previsiblemente liberará dichas variables y recursos asociados. No obstante existen tales situaciones donde los desarrolladores ya sea duplican los códigos de la limpieza varias veces o abuso d do { } while (0);
con break
tan goto
emulación.
Para evitar el mal uso, la implementación se limitó de una manera que no se puede saltar a los bucles. Así que "abuso" en la forma del famoso dispositivo Duff's no será posible.
Al final, PHP se está desarrollando para resolver problemas, no lo protege completamente de disparar con sus propios pies, puede abusar de muchas características de formas mucho peores que esta limitada goto
. Entonces, la conclusión fue que hay casos extremos donde es útil y puede resolver problemas.
goto
en la fuente o no. Si a menudo se los ve en código idiomático o no, es otra cosa. Sin embargo, Goto no causa daño.