Pregunta

He oído rumores de que PHP es la planificación en la introducción de un "goto" de comandos.Lo que se supone que debo hacer?

He tratado de buscar un poco, pero no he encontrado nada muy descriptivo.Entiendo que no va a ser un "GOTO 10"como comando...

¿Fue útil?

Solución

Ellos no son la adición de un real GOTO, pero la ampliación de la RUPTURA de la palabra clave a utilizar estático etiquetas.Básicamente, va a ser la mejora de la capacidad de salir de interruptor de declaraciones anidadas.Aquí el concepto de ejemplo que he encontrado:

<?php
for ($i = 0; $i < 9; $i++) {
    if (true) {
        break blah;
    }
    echo "not shown";
    blah:
    echo "iteration $i\n";
}
?>

Por supuesto, una vez que el GOTO "rumor" estaba fuera, no había nada para detener el mal a los chicos a propagar un adicional COMEFROM broma.Estar en sus dedos del pie.

Vea también:

http://www.php.net/~derick/reunión-notas.html#añadiendo-goto

Otros consejos

Siempre estoy maravillado de cómo increíblemente estúpida PHP diseñadores.Si el propósito de usar GOTOs es hacer salir de multiplicar anidados los bucles más eficiente que hay una mejor manera:etiquetado bloques de código y romper las declaraciones que puede hacer referencia a las etiquetas:

a:  for (...) {
    b:  for (...) {
         c: for (...) {
               ...
               break a;
           }
       }
   }

Ahora es claro que de bucle/bloquear la salida, y la salida está estructurado;usted no puede conseguir el código espagueti con esto como usted puede con el real gotos.

Esta es una vieja, vieja, vieja idea.El diseño de un buen control de gestión de flujo de estructuras ha sido resuelto desde los años 70, y la literatura en todo esto ya ha escrito.El Bohm-Jacopini teorema mostró que se podría codificar nada con la llamada a la función, if-then-else, y mientras que los bucles.En la práctica, para romper profundamente bloques anidados, Bohm-Jacopini estilo codificación extra requerido booleano banderas ("juego de este indicador para salir del bucle") que era torpe de codificación sabio e ineficientes (que no quiere esas banderas en su interior bucle).Con if-then-else, varios bucles (while,for) y salto a etiqueta de bloque, puede codificar el algoritmo sin ningún pérdida en la eficiencia.¿Por qué la gente no lee la literatura, en lugar de la copia de lo que C ¿?Grrr.

Por supuesto, yo no soy un programador de PHP, y no sé qué PHP exacta de la ejecución de GOTO se parecen, pero aquí está mi comprensión de IR a:

GOTO es sólo una más explícita de control de flujo declaración como cualquier otro.Digamos que usted tiene algunos bucles anidados y usted solo necesita encontrar una cosa.Usted puede poner en una instrucción condicional (o varios) y cuando las condiciones se cumplen correctamente, puede utilizar una instrucción GOTO salir de los bucles, (en lugar de tener un 'break' instrucción en cada nivel de anidamiento con una sentencia condicional para cada uno.Y sí, creo que la implementación tradicional es tener denominados etiquetas que la instrucción GOTO puede saltar a por su nombre.Usted puede hacer algo como esto:

for(...) {
    for (...) {
        for (...) {
        // some code
        if (x) GOTO outside;
        }
    }
} 
:outside

Este es un simple (y más eficiente) a la aplicación que sin GOTO.El equivalente sería:

for(...) {
    for (...) {
        for (...) {
            // some code
            if (x) break;
        }
        if(x) break;
    }
    if(x) break;
} 

En el segundo caso (que es la práctica más común) hay tres sentencias condicionales, que es, obviamente, más lento que el de solo tener uno.Así, para la optimización/simplificación razones, es posible que desee utilizar GOTO en bien de bucles anidados.

En el ejemplo dado por steveth45 puede usar una función en su lugar:

function findItem(...) {
  for (...) {
    for (...) {
      for (...) {
        if (x) {
          return theItem;
        }
      }
    }
  }
}

// no need for label now
theItem = findItem(a, b, c);

Es se ve como actualmente se encuentra en PHP 5.3, pero no está totalmente documentado aún.Por lo que puedo decir que comparte sus goto sintaxis de C, así que debería ser fácil de recoger y utilizar.Sólo recuerde que el de Dijkstra advertencia y utilizarlo sólo cuando sea necesario.

@steveth45

Mi regla de oro es que si usted tiene código anidado más de 3 niveles de profundidad, que está haciendo algo mal.

Entonces usted no tiene que preocuparse sobre el uso de varios romper las declaraciones o goto :D

hay un goto en php -> http://php.net/manual/en/control-structures.goto.php, pero yo no lo uso, sólo tiene que escribir normal, código de...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top