error_reporting - Usando ''o die()'' para detener errores en PHP
error reporting php (7)
¿Por qué debería or
devolver algo? or
es un operador booleano normal. $a or $b
es true
si $a
ao $b
evalúa como true
y false
contrario.
La diferencia entre ||
y or
es, eso or
tiene una precedencia de operador más baja, incluso más baja que =
. Esta es la razón por
$result = mysql_query($query) or die();
es igual que
($result = mysql_query($query)) or (die());
mientras
$result = mysql_query($query) || die();
es igual que
$result = (mysql_query($query) || die());
En tu caso
echo $name or "Anonymous";
consigue
(echo $name) or ("Anonymous");
Lo que buscas es probablemente el operador ternario:
echo $name ?: ''Anonymous'';
Lo anterior funcionará a partir de PHP 5.3, si solo tiene uso de PHP 5.2:
echo $name ? $name : ''Anonymous'';
A menudo en PHP, veo:
$result = mysql_query($query) or die();
Viniendo de Python, sé por qué debería funcionar esto, porque or
devuelve el primer valor si es cierto en un contexto booleano, y el segundo valor de lo contrario (vea this ).
Pero cuando intento la técnica anterior en PHP en otro contexto, por ejemplo, algo como:
$name = "John Doe";
echo $name or "Anonymous";
El or
no devuelve el primer valor ("John Doe"), devuelve 1.
¿Por qué funciona esto en el caso de resultado mysql_query (), pero no en otros casos? ¿Es malo usarlo en un caso mysql_query () (ignorar el hecho de que no estoy devolviendo un error útil al usuario)?
En PHP, la asignación de variables (el signo igual) y las funciones tienen prioridad sobre el operador or
. Eso significa que una función se ejecuta primero, luego el valor de retorno de la función se usa en la comparación or
. A su vez, cuando utiliza dos valores / variables junto con un operador or
, compara los dos valores primero y luego devuelve un valor booleano.
Por lo tanto, el orden de evaluación en este ejemplo es:
$result = mysql_query($query) or die();
mysql_query($query)
Devuelve un conjunto de resultados para consultas DQL comoSELECT
, o un valor booleano para consultas DDL, DML o DCL comoCREATE
,DROP
,INSERT
,UPDATE
,DELETE
yALTER
.$result = mysql_query($query)
El resultado de esta ejecución de consulta se asigna a la variable$result
.$result /* = ... */ or die();
Si es un conjunto de resultados otrue
, se considera verdadero (también conocido como "truthy"), por lo que la condiciónor
se cumple y la declaración termina aquí. De lo contrario, el scriptdie()
lugar.
echo
es una construcción de lenguaje y, por lo tanto, en realidad no devuelve un valor, por lo que no se ejecuta como una función antes de que se realice la comparación or
.
Como $name or "Anonymous"
siempre es cierto porque la cadena "Anonymous"
no está vacía y, por lo tanto, es verdad, el echo
convierte de forma implícita en 1
, por lo tanto, esa salida.
El orden de evaluación en este ejemplo es:
$name = "John Doe";
echo $name or "Anonymous";
$name = "John Doe";
Bastante sencillo: asigna la cadena John Doe a$name
.$name or "Anonymous"
PHP descubre que$name
contiene la cadena John Doe , por lo que lo que se evalúa es lo siguiente:"John Doe" or "Anonymous"
Como al menos una cadena no está vacía aquí, se considera veraz y se cumple la condición. Esta evaluación luego devuelvetrue
.echo true /* $name or... */;
Conviertetrue
a1
e imprime el número 1.
Eso es porque el echo no es una función, es un constructo de lenguaje. Imita ser una función, pero en realidad no lo es :)
Nunca usaría die () de esta manera, es un poco áspero. Debes manejar tus errores de manera apropiada, no te limites a rescatarlos.
La cláusula or
se evalúa primero y devuelve un valor booleano que genera el echo
. Si desea generar texto, necesita una construcción if / else como:
echo ($name ? $name : ''Anonymous'');
La razón realmente se me ocurrió poco después de hacer la pregunta. Se trata de la precedencia del operador. El =
sucede antes del or
, entonces:
$result = mysql_query($query) or die();
es equivalente a:
($result = mysql_query($query)) or die();
no:
$result = (mysql_query($query) or die());
Como sería en Python. Así que esto:
$a = false or true;
establecerá $a
a en falso, no es cierto, lo cual está destinado a atraparme en algún momento en el futuro.
PHP hace algo llamado "malabarismo de tipo". En otras palabras: PHP transforma el tipo de cualquier valor para el caso de uso actual. Dado que las cadenas se transformarán a valores "verdaderos", su expresión devuelve verdadero. Pero echo quiere imprimir una expresión de cadena y transforma "true" en 1. Algo molesto en algunos casos, pero si lo sabes, también sabes cómo manejar;)
Por cierto, http://php.net/manual/en/types.comparisons.php : http://php.net/manual/en/types.comparisons.php
Si desea replicar ese comportamiento Y la salida en la pantalla / navegador, necesita una función que devuelva algo distinto de VERDADERO. Printf () puede hacer eso por ti.
echo microtime."<br>";<
$str = "";
printf("%s",$str) or die();
echo "<br>".microtime();
Si $ str está vacío, nulo o falso, se llamará die (), de lo contrario, el script terminará de ejecutarse.