¿Cómo funciona "hacer algo O DIE ()" en PHP?

99

Estoy escribiendo una aplicación php para acceder a una base de datos MySQL, y en un tutorial, dice algo de la forma

mysql_connect($host, $user, $pass) or die("could not connect");

¿Cómo sabe PHP que la función falló para ejecutar la parte del troquel? Supongo que estoy preguntando cómo funciona la parte "o". No creo que lo haya visto antes.

chustar
fuente
3
Aparte, no use este tipo de lógica en aplicaciones reales. Todavía me sorprende la cantidad de tutoriales que hacen eso.
Eran Galperin
2
¿Por qué no usarlo? Es realmente agradable y legible ...
rkj
11
Puede ser simple y apropiado para un tutorial, pero no quiere que su script muera sin gracia con un mensaje de error como ese frente a usuarios reales. Mostrar una página de error personalizada (¡sin especificar el error real!) + Registrar el error es imprescindible.
Eran Galperin
4
Estoy hablando del "o", no del "morir".
Artelius
21
mysql_connect ($ host, $ usuario, $ pass) o PrintNiceError ('DatabsaeConnectionError');
matpie

Respuestas:

133

Si la primera declaración regresa true, entonces la declaración completa debe ser, truepor lo tanto, la segunda parte nunca se ejecuta.

Por ejemplo:

$x = 5;
true or $x++;
echo $x;  // 5

false or $x++;
echo $x; // 6

Por lo tanto, si su consulta no tiene éxito, evaluará la die()declaración y finalizará el script.

nickf
fuente
1
Buena explicación. Esta construcción del lenguaje "implícito si" de PHP es un poco peligrosa, porque puede tener declaraciones que cree que se ejecutan pero en realidad no lo hacen, y eso no es tan obvio como si tuviera un bloque if.
Petruza
6
Esto se llama evaluación de cortocircuito y también es útil en lenguajes distintos de PHP.
Mr Griever
1
Por cierto, solo puede usar una sola declaración después de OR. Una declaración de bloque fallará la verificación de sintaxis (por ejemplo, el mensaje de error real podría ser un error de análisis: error de sintaxis, inesperado '{' en ...)
Scott Chu
Y aquí estaba, pensando que se trataba de algún tipo de función avanzada como la withdeclaración de Python , cuando en realidad es solo una expresión booleana ... Creo que se debe tener especial cuidado al usar esta expresión si se espera que realice una limpieza en caso de errores. Por favor, corríjame si me equivoco, pero si lo hace func_call($file) or die();y la función falla, el archivo se deja abierto cuando los scripts mueren.
pedromanoel
@Petruza ¿Es una buena práctica usarlo oren situaciones en las que ifpodría funcionar?
limeandcoconut
32

PHP orfunciona como C ||(que, por cierto, también es compatible con PHP; orsimplemente se ve mejor y tiene una precedencia de operadores diferente; consulte esta página ).

Se le conoce como operador de cortocircuito porque omitirá cualquier evaluación una vez que tenga suficiente información para decidir el valor final.

En su ejemplo, si mysql_connect()devuelve TRUE, entonces PHP ya sabe que toda la declaración se evaluará como TRUE sin importar lo que se die()evalúe y, por die()lo tanto, no se evalúe.

Si mysql_connect()devuelve FALSE, PHP no sabe si toda la declaración se evaluará como VERDADERO o FALSO, por lo que continúa e intenta evaluar die(), terminando el script en el proceso.

Es solo un buen truco que aprovecha la forma en que orfunciona.

Artelius
fuente
+1 para nombrar cortocircuitos. También podría haber llamado "efecto secundario". No estamos interesados ​​en absoluto en el código de retorno die (), solo queremos el efecto de su ejecución. (No siempre va a morir ()). Esto no siempre es popular entre los puristas ya que algunos efectos pueden ser oscuros.
mckenzm
y esto no es todo. también puedes usar y combinar cosas, donde quieras que una cosa funcione definitivamente antes de hacer una segunda.
Mi1
11

Funciona como otros han descrito.

En PHP, no use "morir", ya que NO genera una excepción (como lo hace en Perl). En su lugar, lanza una excepción correctamente de la forma habitual.

die no se puede capturar en PHP y no se registra; en su lugar, imprime el mensaje sin gracia e inmediatamente sale del script sin decirle nada a nadie ni darle la oportunidad de grabar el evento, reintentar, etc.

MarkR
fuente
-1
$con=mysql_connect($host, $user, $pass)
if(!$con)
{
     die("could not connect");
}
else
{
     echo "Connected";
}
Arun Kumar
fuente