2011-03-25 10 views
5

En PHP si defino una constante de esta manera:PHP indefinido pruebas constantes

define('FOO', true); 
if(FOO) do_something(); 

El método do_something es ejecutado como se esperaba.

Pero si no se define la constante BOO a continuación:

if(BOO) do_something(); 

Entonces do_something también es ejecutado. ¿Que está pasando aqui?

+1

Sí, esta "función" de php me da ganas de golpear mi cara contra mi escritorio. Especialmente cuando me refería a '$ boo', pero escribí' boo', en cuyo caso define() no está realmente en ejecución. – Kzqai

+0

Comportamiento inesperado de hecho. – pbond

Respuesta

9

BOO se forzará en la cadena BOO, que no está vacía, por lo que es cierto.

CodePad.

Es por eso que algunas personas que no conocen mejor acceden a un miembro de la matriz con $something[a].

Debe codificar con error_reporting(E_ALL) que luego le dará ...

Aviso: El uso de indefinido constante HOLA - asumido 'HOLA' en /t.php en la línea 5

Usted puede ver si está definido con defined(). Mucha gente utiliza la siguiente línea por lo que un archivo PHP visitada fuera de su medio ambiente no va a funcionar ...

<?php defined('APP') OR die('No direct access'); 

Este explota short circuit evaluation - si el lado izquierdo es cierto, entonces no necesita ejecuta el lado derecho.

+1

¡Derrotame por 40 segundos! – Anomie

2

PHP automáticamente adivinará que se refería al formato de cadena, que una cadena devolverá como verdadera.

Sin embargo se debe utilizar el defined method:

bool defined (string $name) 

lo tanto, sería:

if(defined('BOO')) {\\code } 
3

Si habilita el registro de errores, verá un error como el siguiente:

PHP Aviso: uso de constante indefinida BOO - asumida 'BOO' en el archivo en la línea N

Lo que sucede es que PHP está asumiendo arbitrariamente que pretendía usar 'BOO' y simplemente olvidó las comillas. Y dado que las cadenas distintas de '' y '0' se consideran "verdaderas", la condición pasa.

2
if($FOO) do_something(); 

Simplemente usando FOO lo toma como un valor en lugar de la variable que ha definido. Es mejor usar PHP defined.

2

PHP está tipeado dinámicamente.Usted puede lograr lo que estamos tratando de hacer con una función como esta:

function consttrue($const) { 
    return !defined($const) ? false : constant($const); 
} 
3

Si no es la existencia de la constante que desea probar, pero si quieres poner a prueba el valor de la constante que define , esta podría ser una mejor manera: if(BOO === true) o if(BOO === false)