2010-03-04 69 views
34

Me pregunto cómo maneja PHP verdadero/falso comparación internamente. Entiendo que verdadero se define como 1 y falso se define como 0. Cuando lo hago if("a"){ echo "true";} echos "true". ¿Cómo reconoce PHP "a" como 1?¿Cómo funciona el verdadero/falso en PHP?

+2

Es demasiado simplista decir que "verdadero se define como 1 y falso se define como 0". –

+1

por cierto.adivina qué devuelve esto: "falso" == verdadero –

Respuesta

71

Esto se explica en la documentación de PHP para booleans y type comparison tables.

Al convertir a boolean, los siguientes valores se consideran FALSO:

  • el booleano FALSE
  • el número entero 0 (cero)
  • el flotador 0.0 (cero)
  • la cadena vacía y la cadena '0'
  • una matriz con cero elementos
  • un objeto con variables cero miembro (PHP 4 solamente)
  • el tipo especial NULL (incluyendo variables no definidas)
  • objetos SimpleXML creados a partir de etiquetas vacías

se considera TRUE Cada otro valor.

+1

En realidad, hay numerosos valores que se convierten en falsos, incluidas las matrices vacías y nulas. ¿O se refería solo a cadenas? – sidereal

+1

@sidereal: Publiqué todo el extracto ahora. Presione actualizar ;-) –

+0

no es la convención usual 'cualquier otro valor que no sea 0 se considera FALSO' ?? como en linux shell. Estoy empezando a perder la fe en la comunidad de programadores – Blauhirn

5

Zero es falso, nonzero es verdadero.

En php puede probar más explícitamente con el operador ===.

if (0==false) 
    echo "works"; // will echo works 

if (0===false) 
    echo "works"; // will not echo anything 
+0

¿por qué '0 === falso' no funcionará? También hay una diferencia entre '0 === false' y' 0 === FALSE'? – JavaSa

+0

No hay diferencia entre '0 === false' y' 0 === FALSE'. Ambos falsos evalúan con el mismo valor; para nombres de funciones y palabras clave de lenguaje, PHP es, desagradablemente, insensible a mayúsculas y minúsculas. Ambos "funcionan", pero se evalúan como falsos, porque '===' en realidad realiza una comprobación de valor dependiente del tipo. '==' permite cheques entre tipos; ver la respuesta aceptada en este hilo de cómo PHP determina qué coincide con falso y qué no. – kungphu

1

PHP utiliza el tipado débil (que llama 'malabarismo tipo'), que es una mala idea (aunque es una conversación para otro momento). Cuando intenta utilizar una variable en un contexto que requiere un valor lógico, se podrá convertir lo que su variable es en un booleano, de acuerdo con algunas reglas sobre todo arbitrarias disponibles aquí: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

+5

Esa "mala idea" es puramente subjetiva: una vez que sabes cómo funciona esto, definitivamente no es un problema, en mi opinión ;-) ;; y las reglas de conversión en su mayoría no me parecen nada lógicas ;-) –

+1

No me hagas publicar una pregunta de stackoverflow sobre qué tan mala idea es una tipificación débil;). Tenga en cuenta que php logra hacer que un silogismo básico falle, porque las conversiones de tipo implícitas hacen que la igualdad php no sea transitiva: echo ("true" == true). "\ N"; // true echo (true == 1). "\ n"; // true echo ("true" == 1). "\ n"; // falso: P – sidereal

+1

Sí ... es un truco (potencialmente) muy peligroso para los nuevos jugadores, pero no necesariamente una mala idea. No voy a defender la solidez del código aquí, pero a veces es un buen atajo. Además, si estás haciendo mucho en el camino del trabajo a mayor escala, probablemente uses métodos de igualdad la mayoría de las veces. – spronkey

0

pensar operador función que unario: is_false(type value) cuales devuelve verdadero o falso, dependiendo de la implementación exacta para el tipo y valor específico. Considere si la declaración para invocar dicha función implícitamente, a través del azúcar sintáctico.

Otra posibilidad es que ese tipo tenga operador de conversión, lo que convierte el tipo en otro tipo implícitamente, en este caso cadena en booleano.

PHP no expone tales detalles, pero C++ permite la sobrecarga del operador que expone detalles finos de la implementación del operador.

3

El mejor operador para la comprobación estricta es

if($foo === true){} 

De esa manera, en realidad está comprobando si es verdad, y no el 1 o simplemente acaba de establecer.