2012-03-02 19 views
28

He visto esto mucho: $fp = fopen($filepath, "w") or die(); Pero parece que no encuentro ninguna documentación real sobre esta sintaxis "o". Es bastante obvio lo que hace, pero ¿puedo usarlo en cualquier lugar? Y debe ser seguido por die()? ¿Hay algunas advertencias para el uso or cuando se puede usar algo comoPHP "o" Sintaxis

if (file_exists($filepath)) 
    $fp = fopen($filepath,"r"); 
else 
    myErrMessage(); 

Sé que parece como una pregunta tonta, pero no puedo encontrar ninguna regla dura y rápida para esto. Gracias.

+1

'o' se puede usar para combinar * expresiones *, no * declaraciones *. Y a veces es útil debido a su menor precedencia del operador (en comparación con la asignación). Por cierto, tus bloques si faltan llaves. No busques atajos de sintaxis hasta que hayas dominado eso. – mario

+1

Las llaves no son necesarias para condicionales seguidos por una sola instrucción. – Andrew

+2

Sí sí; la sintaxis del lenguaje lo permite. Parece amateur y, sin embargo, no está bien visto. – mario

Respuesta

14

Es un operador lógico y se puede usar en cualquier expresión lógica.

http://php.net/manual/en/language.operators.logical.php

+5

También debe observar la precedencia como '$ fp = fopen ($ filepath," w ") o die();' es diferente de '$ fp = fopen ($ filepath," w ") || die(); ' –

+1

Para agregar algo más de información a lo anterior: la primera declaración (usando' o') mira si la primera expresión '$ fp = fopen ($ filepath," w ")' devuelve falso (o cualquier cosa que PHP considera igual a falso, como 'null' o' 0'). Si, y solo si lo hace, ejecuta la segunda instrucción, 'die()'. El segundo hace lo mismo, pero por lo general solo debe usarse en un contexto 'if'. – Thomas

3

Básicamente significa "si el primer comando falla, luego realice el segundo comando". En su ejemplo, si PHP no puede abrir el archivo, terminará el script (die()).

+0

Técnicamente prueba si la primera expresión devuelve un booleano falso, y luego con expresiones booleanas de acceso directo ejecutará la segunda expresión. Si la primera expresión devuelve un valor no falso, las expresiones booleanas de acceso directo significan que no es necesario ejecutar la segunda expresión –

5

or solo hace una comparación boolean.

Lo que devuelve fopen() se puede tratar como un valor booleano, porque devuelve FALSE si falla (y un valor diferente si no lo hace).

Si falla, la instrucción se evalúa a la derecha, por lo que se llama a la función die().

0

Puede ser utilizado como || pero no tiene la misma precedencia: http://www.php.net/manual/en/language.operators.precedence.php

La precedencia de un operador indica qué tan "cerca" se dos expresiones juntas. Por ejemplo, en la expresión 1 + 5 * 3, la respuesta es 16 y no 18 porque el operador de multiplicación ("*") tiene una precedencia mayor que el operador de suma ("+"). Los paréntesis pueden usarse para forzar la precedencia, si es necesario. Por ejemplo: (1 + 5) * 3 evalúa a 18.

3

'O' en PHP es como sintaxis similar a C (||)

<?php 
if(($a==1 || $a==2) && ($b==3 || $b==4) && ($c==5 || $c==6)) { 
    //do that something here. 
} 
?> 

El 'O' que está hablando sobre es sólo un truco como los siguientes estados:

Ejemplo:

$result = mysql_query('SELECT foo FROM bar', $db) or die('Query failed: ' . mysql_error($db)); 

El o morir() truco es una elección muy pobre por varias razones:

  1. No es una manera muy agradable de presentar al usuario un mensaje de error.
  2. No puede detectar el error de ninguna manera.
  3. No se puede registrar el error.
  4. No puede controlar si se debe enviar a la pantalla o no.Está bien hacerlo en un entorno de desarrollo, pero ciertamente no en un entorno de producción.

    5. Le impide realizar cualquier tipo de limpieza. Simplemente termina el guión abruptamente.

de referencia: [introduzca la descripción del enlace aquí] [1]

[1]: http://www.phpfreaks.com/blog/or-die-must-dieenter code here

5

Esta es limpio truco, heredado de algún antecesor PHP, basado en el hecho de que PHP bastante elegante no evaluar cualquier expresión siguiente o, si es devuelto primero verdadera:

function a($ret){ 
    echo "FOO"; 
    return $ret; 
} 
function b($ret){ 
    echo "BAR"; 
    return $ret; 
} 

$result = (a(true) OR b(true)); 

imprimirá solamente FOO, significa que b() ni siquiera se ejecutaron.

8

Digamos que:

$result = first() || second(); 

evaluará a:

if (first()) { 
    $result = true; 
} elseif (second()) { 
    $result = true; 
} else { 
    $result = false; 
} 

mientras:

$result = first() or second(); 

evaluará a:

if ($result = first()) { 
    // nothing 
} else { 
    second(); 
} 

En otras palabras, usted puede considerar:

$result = first() || second(); 

$result = (first() || second()); 

y:

$result = first() or second(); 

a ser:

($result = first()) || second(); 

Es sólo cuestión de preferencia.