¿Por qué se incluyó GOTO en PHP 5? [cerrado]

8

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?

Tulains Córdova
fuente
10
No veo un problema con goto realmente. Realmente no. Sin embargo, la gente parece detestarlo, aunque casi nunca se usa, incluso en los casos en que simplificaría el código. Sí, tiene buenos usos, independientemente de si está acostumbrado a leer gotoen 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.
zxcdw
77
Las máquinas de estados finitos son un poco más fáciles de codificar cuando las tiene goto.
Yannis

Respuestas:

22

La persona responsable da la razón para agregarlo en esta publicación de blog .

[E] l proyecto en el que estaba trabajando (y podría retomar algún día) fue un creador de sitios basado en el flujo de trabajo [...] para crear sitios web dinámicos sin conocer un lenguaje de programación. Construye toda la metainformación sobre cómo debe ejecutarse su sitio, luego el constructor del sitio "compila" eso en el código PHP que se ejecutará en el servidor real.

Se puede hacer sin GOTO, pero la lógica resultante para los bits particularmente complejos de la lógica empresarial se vuelve mucho más simple.

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 gotofue simplemente inevitable)

grahamparks
fuente
19
Así que se hizo para un proyecto en el que ya no trabaja ... Dulce.
Robert Harvey
¡Sí capitán! 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)
ZJR
13

En un nivel inferior, PHP tenía gotodesde 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, switcho cualquier declaración de bucle. Con PHP 5.3 se decidió exportar eso bajo el nombre de gotodespué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 breaktan gotoemulació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.

johannes
fuente
2
¿Ir a la limpieza? ¿Seriamente? ¿Por qué no simplemente implementar una try-finallyconstrucción real ? (¿PHP tiene uno?)
Mason Wheeler
3
@MasonWheeler PHP obtuvo finallybastante recientemente, y después de eso goto.
Yannis
3
Bueno, hay personas a las que no les gustan las excepciones sino ir a. Es un mundo libre ;-)
johannes
77
Y por cierto. siendo el Release Master de PHP 5.3, asumo toda la responsabilidad por esta decisión :-)
johannes
5

Uno puede escribir código incorrecto en cualquier idioma. Tener gotoen el idioma no significa que el idioma sea malo.

Considere las estructuras existentes en varios idiomas - ruptura , continue, next, último , throw. Incluso switch 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:

<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
  while($j--) {
    loop:
  }
}
echo "$i = $i";
?>

Esto no funcionará porque gotoestá 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

<?php
goto a;
echo 'Foo';

a:
echo 'Bar';
?>

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
44
+1: especialmente "tener goto en el idioma no significa que el idioma sea malo"
Deco