2012-07-15 19 views
7

Al ver la exit()PHP documentation me hizo pensar:¿Por qué if/else vs. or/exit en PHP?

preguntas
$filename = '/path/to/data-file'; 
$file = fopen($filename, 'r') 
or exit("unable to open file ($filename)"); 

Pareja:

  1. ¿Cuáles son casos de uso común, además de la apertura de archivos para el uso de exit()?
  2. Dado que no todas las funciones que todos escriben terminan en exit(), ¿cómo se puede utilizar en algunos contextos y en otros?
  3. Son if/else y or/exit intercambiables?
+4

Utilizaron 'o exit' porque está viendo un ejemplo para' exit'. – Gumbo

+0

@Gumbo, edité mi pregunta para eliminar la parte no sensible de la pregunta 3 a la que hace referencia. –

Respuesta

3

En ese contexto, el or en esa declaración es una de PHP logical operators que cuando se utiliza de esa manera, se ejecutará la segunda sentencia si y sólo si el primero falla debido a short circuit evaluation.

Dado que fopen devolvió falso, la instrucción or exit se ejecuta ya que falló la primera parte.

Para entenderlo mejor, aquí hay una explicación rápida de la evaluación de cortocircuitos.

$x = 5; 
$y = 42; 

if ($x == 5 or $y == 42) { 
    echo "x or y is true"; 
} 

En el código anterior, la expresión $y == 42 Nunca se evalúa porque no hay necesidad ya que la primera expresión era cierto.

En ese ejemplo, utilizan la misma lógica para decidir si se evalúa o no la instrucción que llama al exit.

para responder a sus preguntas:

  1. Yo no usaría la salida al abrir un archivo fallaron a menos que el programa fue muy específico. Lo mejor que puede hacer es registrar un error y luego devolver el error a la persona que llama para que puedan decidir qué hacer.
  2. Cuándo utilizar exit depende completamente del código que está escribiendo.
  3. Dada la explicación sobre el cortocircuito, sí son intercambiables en ese sentido. El uso de or exit es solo un poco más corto que con if/else.

Espero que ayude.

+0

- @ drew010, genial, gracias! –

1

Yo diría que usa exit en una situación donde su código no puede continuar si la función que estaba realizando falla. Por ejemplo, leyendo un archivo que se necesita.

+0

Según el manual '" morir - Equivalente a la salida "'. Mientras que la descripción de 'exit': ' Termina la ejecución del script. Las funciones de cierre y los destructores de objetos siempre se ejecutarán aunque se llame a la salida. –

+0

lol ok my bad :) debe haberlo leído mal en algún otro lugar. –

2

Tiendo a evitar el uso de exit(), ya que es una manera realmente fea de manejar los errores desde la perspectiva del usuario.

Si debe usarlo, cualquier error no recuperable sería un candidato. Por ejemplo, consulta de base de datos o fallas de conexión, o fallas de solicitud remota.

if/else es equivalente a ...or whatever(). Es solo una cuestión de estilo, con esta última forma es más sucinta.

4
  1. secuencias de comandos de la CLI, la salida puede tomar un parámetro entero que se alimenta de nuevo a la consola para indicar el éxito o algún tipo de error
  2. no estoy inclinado a usar exit() o die() en código de la aplicación, ya que son excepciones privilegiado. Sin embargo, personalmente creo que podrías complicar un poco las cosas un poco ... mata la ejecución de scripts, así que úsalo cuando necesites matar un script. A decir verdad, la mayoría de las veces solo elimino las secuencias de comandos a mitad de la ejecución cuando se depuran (puntos de interrupción únicos) y eso tampoco es ideal (de nuevo, las excepciones hacen un mejor trabajo).
  3. El uso de or es principalmente conveniente. He aquí un punto interesante, aunque ...

¿Por qué

$resource = mysql_connect() || die('dead') 

no funciona?

La respuesta es que el operador = tiene prioridad sobre or para que la asignación se haga primero así: ($resource = mysql_connect()) or die(). De esta manera es exactamente como hacer un if(!($resource = mysql_connnect())) { die() }

+0

- @ damiand, gracias ¡Acabo de aprender mucho! –