Operador doble no (!!) en PHP

188

Lo que hace el doble no operador en PHP?

Por ejemplo:

return !! $row;

¿Qué haría el código anterior?

Andrei
fuente
32
Esto es esencialmente lo mismo que hacerreturn (bool) $row;
WildlyInaccurate el
55
Me preguntaba cuál de ellos es más rápido y tenemos (bool) como ganador. i.stack.imgur.com/dcnsM.png
Binod Kalathil
1
@Binod es una información agradable, ¡gracias por eso!
Robin K

Respuestas:

291

No es el "operador doble no", es el operador no aplicado dos veces. El derecho !dará como resultado un booleano, independientemente del operando . Entonces la izquierda !negará ese booleano.

Esto significa que para cualquier valor verdadero (números que no sean cero, cadenas y matrices no vacías, etc.) obtendrá el valor booleano TRUE, y para cualquier valor falso (0, 0.0, NULLcadenas vacías o matrices vacías) obtendrá El valor booleano FALSE.

Funcionalmente es equivalente a un elenco para boolean:

return (bool)$row;
Theo
fuente
22
"double-not-operator" o "double-not-operator" ... depende de cómo lo leas.
nickf
9
@nickf no realmente, "el operador no doble" se refiere a un operador, no el acto de usar el operador no dos veces.
Theo
3
@Theo, ¿en realidad es un operador? ¿El intérprete lo considera !!igual (bool)en este caso? ¿O se ejecutará un código de máquina diferente según cuál se use?
Pacerier
Esto también funciona para JavaScript, aquí hay una lista de valores falsos para Javascript y aquí hay una lista de valores falsos para PHP
Jomar Sevillejo
1
Puedes usar tantos como quieras. Si hay un número impar de 'golpes' (puntos de exclamación), la operación NO será la misma que !value, y si hay un número par de golpes, será el mismo (bool) value.
diamondsea
51

Es lo mismo (o casi lo mismo, puede haber algún caso de esquina) como lanzar a bool. Si $rowse convertiría en verdadero, entonces !! $rowtambién es cierto.

Pero si quieres lograrlo (bool) $row, probablemente deberías usar solo eso, y no algunas expresiones "interesantes";)

viraptor
fuente
2
Gracias que realmente tiene sentido, nunca he visto algo así en otro lenguaje de programación.
Andrei
16
Usar !!es un hábito restante de la programación en C (++). En C hacer un lanzamiento no es tan fácil como en PHP, puede obtener muchos problemas diferentes, compilar advertencias, etc. Así las personas lanzan al boll usando !!.
NikiC
1
@nikic - Suena extraño, OMI ... ya que operator!es sobrecargable, usarlo C++sería peligroso. Tampoco puedes lanzar estructuras en C, o usarlas !con ellas. Además, si se puede negar algo, lo más probable es que pueda devolverlo desde una función que devuelve int, lo que lo convierte en un booleano. ¿Estás seguro de que estás hablando de C?
viraptor
2
He visto !! en muchos programas C como una conversión segura a 1/0. (Como booleano realmente no es más que 0 / "no cero" en C.)
Prof. Falken
1
@viraptor, !!no es nada "interesante" como lo has dicho. Está por todas partes desde C a JavaScript.
Pacerier
18

Significa que si $rowtiene un valor verdadero , devolverá true, de lo contrario false, se convertirá en 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

fuente
7

"no no" es una forma conveniente en muchos idiomas para comprender qué valor de verdad asigna el lenguaje al resultado de cualquier expresión. Por ejemplo, en Python :

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

Puede ser conveniente en lugares donde desea reducir un valor complejo a algo como "¿hay algún valor?".

Steve Bennett
fuente
1

Otra forma más humana, quizás más simple, de "leer" el no no:

  • El primero '!' hace 2 cosas: 'convierte' el valor a booleano, luego genera su opuesto. Entonces dará verdadero si el valor es 'falso'.

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

Entonces, básicamente, el valor de entrada puede ser cualquier cosa, tal vez una cadena, pero desea una salida booleana, así que use el primer '!'. En este punto, si desea VERDADERO cuando el valor de entrada es 'falso', deténgase aquí y use un solo '!'; de lo contrario, si desea VERDADERO cuando el valor de entrada es 'verdadero', agregue otro '!'.

Luca Reghellin
fuente
0

Miremos a

!$a;

En lugar de interpretar el! operador como tomar el

Opuesto booleano del valor a su derecha

leer

tomar el opuesto booleano de la expresión a su derecha

En este caso

$a;

podría ser una expresión

así es

!$a;

Asi es

!!$a;

y

!!!$a;

y así, como cada una de estas es una expresión válida, el! El operador puede anteponerse a cada uno de ellos.

Chris Rutledge
fuente