son - return php
PHP y la instrucción goto que se agregará en PHP 5.3 (16)
La declaración "goto" viene directamente de ASM o de cualquier otro lenguaje de ensamblador.
Aquí hay un enlace: http://be2.php.net/manual/en/control-structures.goto.php
Me pregunto: ¿qué puede hacer esto para que mi código esté mejor organizado? ¿Cómo puedo implementar esto en proyectos más grandes, sin arruinarlo? Ya que el goto te permitirá saltar de un lado a otro, las asignaciones accidentales y los bucles infinitos están esperando que suceda si lo usas de manera incorrecta.
¿Puede alguien darme un ejemplo de un buen uso de esto?
EDIT: bien, he visto algunas de las respuestas y aparentemente existe un amplio consenso sobre el uso de la declaración "goto" y es malo.
Así que todavía me pregunto: ¿por qué PHP se molestaría en agregarlo al lenguaje? Si no vieran algo en él, no lo harían ... entonces, ¿por qué?
También: una discusión aquí en StackOverflow sobre "goto" en general
EDIT2: Viendo que esta pregunta indujo muchas cosas malas a estar tristes por la declaración de goto, fui y le pregunté a mi padre. Tiene 52 años y es ingeniero industrial.
Me dijo un par de veces que hacía una buena cantidad de programación en sus días y sobre todo en FORTRAN y COBOL. Actualmente realiza servicios de TI, servidor y gestión de redes y demás.
De todos modos, dijo algunas cosas sobre "en mi día ..."
Después de discutir eso un poco, regresó a la declaración de goto, diciendo que incluso en sus días de estudiante, ya sabían que no era una buena idea usarla, pero no tenían mucho mejor en ese entonces. Todavía faltaban muchos años para intentar / atrapar y el manejo de errores apenas existía.
Entonces, ¿qué hiciste para revisar tu programa? Agregue unas pocas líneas al final que le permitan imprimir los resultados y todo lo que necesita para verificar su código, y luego coloque la línea: "goto printing", o algo así, para comenzar a imprimir sus datos.
Y de esta manera, gradualmente depuró su código.
Está de acuerdo en que el uso de goto en el mundo de la programación moderna es bastante inútil. El único uso que encuentra justificado es una "pausa de emergencia", que se utiliza en situaciones de depuración extrema e inesperadas. Un poco como goto fatal_error;
y haga que la parte "fatal_error" de su código haga algunas cosas para mostrarle los resultados en profundidad.
Pero solo durante la creación de algo. Un producto terminado no debe tener goto-declaraciones.
LATE EDIT: Otra discusión sobre "goto" en PHP5.3 / PHP6
A veces uso goto
para evitar múltiples ifs anidados. No se trata solo de la lógica, la estructura o el flujo del programa, a veces puede tratarse de cómo se ve el código.
Admito que nunca he usado goto en mis códigos. :)
La única razón para mí parece facilitar la ruta de migración más corta de otros idiomas a PHP (prácticamente solo cambiando el idioma sin tocar las estructuras de control) y refactorizar el código en la segunda etapa de la conversión.
Personalmente creo en colegas educados y como pueden evitar las interrupciones condicionales de los bucles, podrían resistir la tentación de ir a goto.
Como se ha dicho antes, goto solo es realmente requerido en algunos tipos de algoritmos, generalmente aquellos que surgen en el análisis de lenguaje o en máquinas de estados finitos. Nunca me he perdido la falta de goto en PHP.
OTOH, he programado en un lenguaje donde las dos únicas estructuras eran funciones y gotos condicionales: SNOBOL4 . Dado que el riesgo de código de espagueti era tan alto, la mayoría de los programadores de SNOBOL4 fueron / tienen cuidado de evitar eso. Pero los gotos sí permitieron una programación muy apretada, ejecuciones de bucles creativos, etc. En realidad es algo más fácil hacer bucles tipo FSM si todo lo que tienes son gotos.
El código generado podría hacer un buen uso de goto, supongo. Lo bueno del código generado es que no necesita mantenerlo, simplemente lo regenera.
El uso principal que veo al tener gotos en un idioma es la capacidad de portar a través de los idiomas. Escribí un generador de analizador en C que generaba analizadores con gotos (porque era más fácil usar gotos que implementar estructuras de control más sanas), y ahora llevarlo a PHP no es tanto un dolor de cabeza.
En la codificación Classic VB, el uso de goto es útil para emular el manejo de errores de prueba / captura de esta manera:
Function MyFunction() as String
''-- start of error block
''
On Error Goto Catch
'' do something here that might cause an error
MyFunction = "IT WORKED"
Exit Function
Catch:
'' error occured - do something else
MyFunction = Err.Description
''
''-- end of error block
End Function
... y aquí hay una manera de emular el try / catch / finalmente ..
Function MyFunction() as String
''-- start of error block
''
On Error Goto Catch
'' do something here that might cause an error
MyFunction = "IT WORKED"
Goto Finally
Catch:
'' error occured - do something else
MyFunction = Err.Description
Err.Clear
Finally:
'' put your finally code here
''
''-- end of error block
End Function
También puede ser útil para la limpieza al final de una función, aunque supongo que se podría argumentar que se puede llamar a otra función para realizar esa limpieza.
Con toda honestidad, nunca he tenido una ocasión en PHP donde pensé para mí mismo ''hmm, me gustaría que hubiera una declaración goto''. No he leído por qué decidieron hacer esto, pero, esos tipos son muy inteligentes y han tomado PHP en muy buenas direcciones hasta ahora, así que tal vez estén anticipando una necesidad de la cual aún no nos damos cuenta.
GOTO, la estructura de control de ejecución restringida, se puede usar en lugar de los bucles, pero eso es altamente desaconsejable. Su uso tiende a fomentar la creación de código no estructurado, que es una práctica terrible. Lo más probable es que sea mejor si se usa solo en el desarrollo, para la depuración (omitir grandes cantidades de código para acceder a un área de problemas en particular) y realizar pruebas. El único otro propósito para el GOTO es posiblemente escribir un ensamblador; No es probable. GOTO, si se usa fuera del desarrollo, debe usarse con moderación y solo como último recurso. Si es posible, reemplace un GOTO con una estructura de bucle aplicable.
En cuanto al hilo enlazado último ( comando GOTO en PHP? ):
Según lo indicado por Ishmaeel (editado por Gordon; con mucho, la mejor respuesta):
El GOTO es simplemente un DESCANSO extendido, con la capacidad de "usar etiquetas estáticas". "Básicamente, mejorará la capacidad de romper las declaraciones if anidadas".
Goto se utiliza principalmente al escribir máquinas de estados finitos. Cuando analice la gramática sin contexto, en realidad necesitará una de esas. Aunque podríamos vivir sin goto si continue $case;
es una declaración válida dentro de un bloque de interruptores para saltar a un caso diferente y fuera del curso con rangos de casos como muchos idiomas hoy en día. Hasta entonces estamos bastante atrapados con goto.
La gran ventaja de los gotos es la curva de aprendizaje. Uno se pregunta por qué las herramientas como los estudios visuales y los macs funcionan bien. La razón es que la gente quiere más que un gran producto; Quieren un gran producto que puedan aprender a usar en solo una hora. Muchos programadores hoy en día solo programan como uno de sus trabajos. Veo que muchos libros dicen que uno nunca debería usar un goto y luego dar cinco o más tecnologías de tal manera que digan que eliminen todas las necesidades. Yo digo que solo el hecho de que hayan mencionado 5 es una prueba de lo bueno que es el goto !!!!! ¡No tengo tiempo para enseñar cinco cosas que incluyen estructuras de excepción que requieren capítulos completos para explicar! Cuando todo lo que realmente necesitas es un simple goto que puede explicarse en 30 segundos. Claro, puedes crear código incorrecto con ellos si el programador lo desea, pero bueno, la mayoría de los programadores no quieren escribir código incorrecto y, si lo hicieron, podrían hacerlo de todos modos. La mayoría de los gotos en nuestro laboratorio hicieron que el código fuera extremadamente fácil de entender y aprender; mucho más que leer un libro de 2000 páginas.
La respuesta corta es que goto es una solución alternativa para un espacio de pila limitado con un rendimiento mucho mejor en un solo código. Además del espacio o el rendimiento de la pila de direcciones, su uso sería al menos innecesario y, en el mejor de los casos, inapropiado porque causa una complejidad innecesaria.
En más de 2 millones de líneas de código he escrito en todos los idiomas, excluyendo el código de máquina :-). Solo dos veces ha sido necesario su uso, y ambos se deben a la inspección y clasificación de conjuntos de datos de árboles grandes.
No hay tal cosa como un buen uso de goto.
Tal vez, solo tal vez, podría ser útil salir de múltiples bucles anidados, pero ya puede hacerlo usando "break 2" y demás. Los saltos etiquetados como en Java serían mejores que ir a este propósito.
Tal vez también sea útil con el código escrito sin usar excepciones, cuando necesita saltar al final de un montón de declaraciones una vez que falla. Pero eso solo es arreglar el código de mierda con más código de mierda.
Se puede utilizar para fines de depuración para que no tenga que comentar o refactorizar bloques de código solo para cambiar temporalmente el flujo de trabajo.
Si estás escribiendo un buen código PHP, no deberías usar goto. Creo que es un error que lo estén agregando, ya que solo conduce a la programación perezosa.
Ver
http://www.procata.com/blog/archives/2004/07/29/goto-in-php/
Para un buen comentario sobre la adición de esto a PHP, y también, aquí en el desbordamiento de pila,
Solo he encontrado dos usos para goto
:
- Para romper los bucles anidados. Pero la mayoría de los lenguajes más nuevos tienen un mecanismo para hacer esto sin
goto
todos modos (break <number>
en PHP, obreak <loop label>
en Java, etc.). - Para ir a una sección de limpieza al final de una función. Pero, de nuevo, esto no suele ser útil en un lenguaje de recolección de basura.
En otras palabras, si no sabes si debes usar goto
para algo, no deberías.
goto puede ayudar a reducir la duplicación de código para el desenrollado de pila, en el siguiente pseudo código:
do A
if (error)
goto out_a;
do B
if (error)
goto out_b;
do C
if (error)
goto out_c;
goto out;
out_c:
undo C
out_b:
undo B:
out_a:
undo A
out:
return ret;
(Seudo código de Robert Love, tomado de la lista de correo del archivo del kernel de Linux: https://lkml.org/lkml/2003/1/12/203 )
goto
debería ser realmente algo que estaba en el idioma y se haría obsoleto debido a mejores prácticas de programación. Agregarlo ahora parece un paso atrás.