2012-10-03 28 views
5

Bastante simple pregunta aquí. He estado revisando un código y he visto una función que parece convertir una variable determinada en booleana. Funciona así:PHP convirtiendo a boolean usando '!!'

function to_bool($var) { 
    return !!$var; 
} 

Bastante simple, pero ¿cómo funciona? Nunca he visto esto antes, y google no me ha llevado a ninguna parte. ¿El extra '!' tipo de cambio el resultado? '! $ var' se puede usar para verificar si var es falso, también lo hace '!!' convertir un 'falso' en verdadero, y viceversa?

+0

¿Qué significa '(bool) $ var;' porque nunca había visto eso antes que los dos !! antes de una variable – rsz

+2

'!' se niega, por lo que dos dobles negaciones, convirtiendo lo que sea en boolean ... – jeremy

+0

Doble negativos, estaba pensando eso. Muy raro. ¿Es completamente confiable, crees? –

Respuesta

9

cómo funciona?

El operador no coloca la variable en un condicional. Por lo tanto, el resultado es booleano. El segundo no voltea su valor.

Es más claro sólo para usar una conversión explícita en el código en lugar de una función de este tipo:

(bool)$var; 
+0

Para ser pedante, es el segundo 'no' en la secuencia temporal, o el primer 'no' en la secuencia física, que cambia el valor. –

+0

@Seth: Correcto. Así es como lo dije en serio. – webbiedave

3

Un ! sería un booleano invertido, por lo que dos !! hacen un booleano no invertido. Es una doble negación de una variable y devuelve como un tipo booleano

3

Take !! 2

!2 evalúa a !(true)

que evalúa a resultado !false extremo true. El booleano no básicamente trata el operando correcto como un bool.

2

Hmmm ... interesante.

Bueno, PHP sigue un conjunto específico de reglas al determinar si una variable es "verdadera" o "falsa".

El uso de ciertos operadores obligará a tomar esa decisión. Por ejemplo, cuando agrega una cadena "a" y un número entero 2 con el operador ., obtendrá "a2", porque la intención del operador . es concatenar.

Aquí, el primer ! significa que está intentando anular la variable. Negar algo significa que primero debes tratarlo como booleano, y eso es lo que hace. Luego, el segundo ! simplemente lo niega.

Es una forma extraña de hacerlo. Francamente, if ($var) daría el mismo resultado que su if (to_bool($var)).

+0

¿Crees que '!! $ var' sería un método más rápido para verificar que 'to_bool ($ var)'? ¡Solo por curiosidad realmente! ¡Obviamente una diferencia bastante insignificante si la hay! –

+0

'if ($ var)' es el más rápido, pero sí, la diferencia sería insignificante. –