2010-01-24 10 views
142

¿Qué hace el operador doble en PHP?Operador doble no (!!) en PHP

Por ejemplo:

return !! $row; 

¿Cómo sería el código de seguridad hacer?

+26

Esto es esencialmente lo mismo que hacer 'return (bool) $ row;' – WildlyInaccurate

+2

Me preguntaba cuál de ellos es más rápido y tenemos (bool) como ganador. https://i.stack.imgur.com/dcnsM.png – Binod

Respuesta

219

no es el "doble operador not", que es el operador no aplica dos veces. El ! derecho dará como resultado un booleano, independientemente del operando. Entonces, el ! izquierdo negará ese booleano.

Esto significa que para cualquier valor verdadero (número distinto de cero, las cadenas no vacías y matrices, etc.) obtendrá el valor booleano TRUE, y para cualquier valor falso (0, 0.0, NULL, cadenas vacías o matrices vacías) obtendrá el valor booleano FALSE.

Es funcionalmente equivalente a un elenco de boolean:

return (bool)$row; 
+16

"doble no operador" o "doble no operador" .. depende de cómo lo lea. – nickf

+6

@nickf no realmente, "el operador no doble" se refiere a un operador, no el acto de usar el operador no dos veces. – Theo

+2

@Theo, ¿En realidad es un operador? ¿Considera el intérprete '!!' igual a '(bool)' en este caso? ¿O se ejecutará un código de máquina diferente dependiendo de cuál se use? – Pacerier

42

Es lo mismo (o casi lo mismo - podría haber algún caso en la esquina) como castear a bool. Si $row se convertiría en verdadero, entonces !! $row también es verdadero.

Pero si se quiere lograr (bool) $row, probablemente debería utilizar sólo eso - y no algunas expresiones "interesantes";)

+1

Gracias que realmente tiene sentido, nunca he visto algo como esto en otro lenguaje de programación. – Andrei

+13

Usar '!!' es un hábito que queda de la programación en C (++). En C hacer un cast no es tan fácil como en PHP, puedes obtener muchos problemas diferentes, compilar advertencias, a.s.o. Por lo tanto, la gente lanza al cascar usando '!!'. – NikiC

+1

@nikic - Parece extraño, IMO ... ya que 'operator!' Es sobrecargable, usarlo en 'C++' sería peligroso. Tampoco puedes lanzar estructuras en C, o usar '!' Con ellas. Además, si se puede negar algo, lo más probable es que lo devuelva desde una función que devuelve int, que prácticamente lo convierte en booleano. ¿Estás seguro de que estás hablando de C? – viraptor

13

Esto significa que si $row tiene un valor truthy, volverá true, de lo contrario false, la conversión a un valor booleano.

Aquí hay expresiones de ejemplo para la conversión booleana de documentos php.

Expression    Boolean 
$x = "";    FALSE 
$x = null;    FALSE 
var $x;    FALSE 
$x is undefined  FALSE 
$x = array();   FALSE 
$x = array('a', 'b'); TRUE 
$x = false;   FALSE 
$x = true;    TRUE 
$x = 1;    TRUE 
$x = 42;    TRUE 
$x = 0;    FALSE 
$x = -1;    TRUE 
$x = "1";    TRUE 
$x = "0";    FALSE 
$x = "-1";    TRUE 
$x = "php";   TRUE 
$x = "true";   TRUE 
$x = "false";   TRUE 
+0

No necesariamente. Si el valor de '$ row' es 0, devolverá' false', por ejemplo. – Phiter

+1

Actualizado, gracias – YOU

6

"No, no" es una manera conveniente en muchos idiomas para la comprensión de lo que el lenguaje valor de verdad asigna al resultado de cualquier expresión. Por ejemplo, en Python:

>>> not not [] 
False 
>>> not not [False] 
True 

Puede ser conveniente en los lugares donde se desea reducir un valor complejo a algo así como "no es un valor en absoluto?".

0

Otro, quizás más simple, mucho más humana de 'leer' el no no: '!'

  • La primera hace 2 cosas: 'convierte' el valor a booleano, luego saca su opuesto. Por lo tanto, dará verdadero si el valor es falso.

  • El segundo '!' es solo para producir el opuesto al primero.

Así que, básicamente, el valor de entrada puede ser cualquier cosa, tal vez una cadena, pero que desea una salida booleana, a fin de utilizar la primera '!'. En este punto, si quiere TRUE cuando el valor de entrada es 'falsy', entonces deténgase aquí y simplemente use un único '!'; de lo contrario, si desea VERDADERO cuando el valor de entrada es 'verdad', entonces agregue otro '!'.