Hace algún tiempo descubrí que la palabra clave de control GOTO se introdujo en PHP 5.3.0.
http://php.net/manual/en/control-structures.goto.php
¿Por qué sucedió?
¿Cuáles son los objetivos de diseño del lenguaje detrás de esto?
¿Lo pidió la comunidad de desarrolladores de PHP?
php
language-design
control-structures
goto
structured-programming
Tulains Córdova
fuente
fuente
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.goto
.Respuestas:
La persona responsable da la razón para agregarlo en esta publicación de blog .
En defensa de PHP, solo le permite saltar a etiquetas dentro de un alcance limitado, lo que limita el daño que se puede hacer.
(También podría argumentar que dada la forma en que PHP aparentemente ha absorbido cada construcción de cada lenguaje de programación que se haya inventado, la adición de
goto
fue simplemente inevitable)fuente
every construct from every programming language ever invented
! ...¡Al infinito y más allá! (y pensar que eso es lo que solían decir de Perl 5 ... Estoy muy orgulloso de esta pequeña y creciente tontería sin sentido llamada PHP)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 degoto
después de una larga discusión.Las razones principales fueron:
Es posible que los dos primeros elementos no necesiten explicación, y la tercera parte trata sobre situaciones como esta:
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);
conbreak
tangoto
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.fuente
try-finally
construcción real ? (¿PHP tiene uno?)finally
bastante recientemente, y después de esogoto
.Uno puede escribir código incorrecto en cualquier idioma. Tener
goto
en el idioma no significa que el idioma sea malo.Considere las estructuras existentes en varios idiomas - ruptura ,
continue
,next
, último ,throw
. Inclusoswitch
estas son todas las formas de un recorrido calculado que va desde un nivel de alcance al mismo o mayor nivel de alcance.El problema con goto es cuando entra en un nivel más profundo de alcance o salta marcos de pila.
Uno notará el Ejemplo 3 en el documento vinculado de la pregunta:
Esto no funcionará porque
goto
está intentando saltar a un nivel más profundo de alcance.No hay nada malo con varias formas de goto restringido, ya sea la palabra clave llamada goto o algún otro nombre de ramificación. Las alternativas (condicionales feas para bucles) a menudo pueden ser peores. Tal como están las cosas, usar goto simplifica
Personalmente, no me gusta el ejemplo dado como ejemplo # 1
Sin embargo, esto no causa problemas con el lenguaje que no sea la necesidad de aplicar alguna forma de experiencia de aprendizaje corporal al desarrollador que intencionalmente escribe código como este.
fuente