2011-06-01 26 views
18

Pregunta estúpida - Me sorprende que esta me haya mordido. ¿Por qué las constantes indefinidas en PHP se evalúan como verdaderas? caso¿Por qué las constantes indefinidas se evalúan como verdaderas?

prueba:

<?php 
    if(WHATEVER_THIS_ISNT_DEFINED) 
     echo 'Huh?'; 
?> 

el ejemplo anterior imprime 'eh?'

¡Muchas gracias por su ayuda! :)

+0

Wow, PHP sorprende de nuevo. Razón probable: "porque no se evalúa como falso" :) – Rekin

+7

No, no hay sorpresas. La advertencia explica todo, "Aviso: uso de la constante indefinida MY_CONST - asumida como 'MY_CONST' en some_script.php en la línea 5". Desarrollar con avisos y advertencias activadas :) –

+0

Mantenga las [comparaciones sueltas de PHP] (http://php.net/manual/en/types.comparisons.php#types.comparisions-loose) en mente para saber por qué '" WHATEVER_THIS_ISNT_DEFINED "== TRUE'. –

Respuesta

25

Trate defined('WHATEVER_THIS_ISNT_DEFINED')

Cuando PHP se encuentra una constante que no está definido, se produce una E_NOTICE, y utiliza el nombre de la constante que ha intentado utilizar como una cadena. Es por eso que su fragmento imprime Huh!, porque una cadena no vacía (que no es "0") evaluará a true.

Del manual:

Si utiliza una constante definida, PHP supone que quiere decir el nombre de la constante sí, al igual que si se llama a como una cadena (constante vs " CONSTANTE"). Se producirá un error de nivel E_NOTICE cuando ocurra esto .

Si configura su nivel de informe de errores para reportar E_NOTICE s, lo cual es una buena práctica durante el desarrollo, también verá la notificación lanzada.

+1

Realmente necesita 'defined ('WHATEVER_THIS_ISNT_DEFINED')'. Sin las comillas, desencadena el mismo error de notificación exacto. –

+0

@Frank Gracias, estaba demasiado ocupado mejorando las otras partes de mi respuesta :). – kapa

1

Tenga en cuenta que el nombre constante siempre debe ser citado cuando se define.

p. Ej.

  • define('MY_CONST','blah') - correcta
  • define(MY_CONST,'blah')-incorrecta

también

<?php 
if (DEBUG) { 
    // echo some sensitive data. 
} 
?> 
and saw this warning: 
"Use of undefined constant DEBUG - assumed 'DEBUG'" 

A clearer workaround is to use 
<?php 
if (defined('DEBUG')) { 
    // echo some sensitive data. 
} 
?> 

Ver http://php.net/manual/en/language.constants.php

2

constantes indefinidas son tratadas como cadenas por PHP: docs. Tomando este hecho, creo que a través en el idioma Inglés:

If "WHATEVER_THIS_ISNT_DEFINED", then do something. 

... es lógico que es "verdad" - no se está comparando nada a cualquier otra cosa.

Es por eso que, al hacer las declaraciones if, se recomienda incluir una evaluación específica. Si está comprobando si es falso, escríbalo en el código: if (something === false) contra if (something). Si está revisando para ver si está configurado, use isset, y así sucesivamente.

Además, esto resalta la importancia de desarrollar avisos y advertencias habilitados. Su servidor lanzará un aviso para este problema:

Aviso: El uso de indefinido constante MY_CONST - asumido 'MY_CONST' en some_script.php en la línea 5

Encienda avisos y advertencias para desarrollar , apáguelos para la producción. Solo puede ayudar!

2

Probar defined(). Si no está definido, la constante asume que es simplemente texto.

7

Del manual:

Si utiliza una constante definida, PHP asume que quiere decir el nombre de la constante de sí mismo, al igual que si se llama como una cadena (constante vs "constante").

Básicamente, si WHATEVER_THIS_ISNT_DEFINED no está definido, PHP lo interpreta como "WHATEVER_THIS_ISNT_DEFINED". cadenas no vacías evalúan a true, por lo que su expresión siempre pasará (a menos WHATEVER_THIS_ISNT_DEFINED es definido y establecido en un valor Falsey-.)

Esto es, francamente, estúpido comportamiento. Fue implementado, creo, para permitir que cosas como $foo[bar] funcionen cuando el programador debería haber usado $foo['bar']. Es un comportamiento ilógico como este que hace que la gente piense que PHP no es un lenguaje de programación real.

La forma de comprobar si se define una constante es con defined.

0

No son solo constantes, es un problema mucho más con el motor de análisis de PHP. (Debería ver las advertencias en sus registros.)

En PHP, "palabras simples" que no reconoce generalmente se tratan como cadenas que faltan a sus presupuestos, y cadenas con una longitud distinta de cero tend to evaluate to true .

Prueba esto:

$x = thisisatest ; 
$y = "thisisatest"; 
if($x == $y){ 
    echo("They are the same"); 
} 

debe ver "Ellos son los mismos".

+0

No es un problema más amplio, solo se aplica a las constantes (que son básicamente palabras simples). En su ejemplo 'thisisatest' es una constante indefinida. Es solo una convención de nombres usar letras mayúsculas para las constantes. – kapa

Cuestiones relacionadas