2012-03-02 17 views
12

Estoy tratando de definir una constante, pero no quiero redefinirla si ya se ha definido. Aquí hay un ejemplo de C:¿Tiene PHP un equivalente del #ifdef de C/C++?

#ifndef BASEPATH 
#define BASEPATH /mnt/www 
#endif 

¿Cuál es la forma más elegante de hacer esto en PHP?

+1

http://php.net/manual/en/function.defined.php – j08691

+0

Técnicamente, no, como '' define'/'defined' de PHP se evalúan en ** runtime ** (PHP define son casi lo mismo que variables), y no hay preinstalador (incorporado) ** que sea capaz de deshabilitar un grupo de líneas de código sin evaluar su corrección de sintaxis (por ejemplo, deshabilitar sintácticamente el código incorrecto con 'if (defined (...)) de PHP) 'no ayudaría). – leemes

Respuesta

23

Uso defined() y define().

if (!defined('BASEPATH')) { 
    define('BASEPATH', '/mnt/www'); 
} 
+2

¡Agradable! Lo que me he decidido es esto (todo en una línea): 'defined ('BASE_PATH') || define ('BASE_PATH', '/ mnt/www /'); 'Si' defined() 'es ** true **, el resto del condicional nunca se evalúa, si' defined() 'devuelve ** false ** , se evalúa la segunda mitad del condicional y se define 'BASE_PATH'. – DavidH

4

Uso defined() función

if(!defined("constantname")) { 
    define("constantname", "value"); 
} 
1

Uso defined():

<?php 
/* Note the use of quotes, this is important. This example is checking 
* if the string 'TEST' is the name of a constant named TEST */ 
if (defined('TEST')) { 
    echo TEST; 
} 
?> 
1

Ésta es la reescritura condensada de la respuesta de Radu anterior (y todos los demás).

defined('BASE_PATH') || define('BASE_PATH', '/mnt/www/');  

Eso es todo. Si defined('BASE_PATH') se evalúa como verdadera , el resto del condicional nunca se evalúa. Si devuelve falso, se evalúa la segunda mitad del condicional y se define BASE_PATH.

+2

Recomiendo la versión más larga, incluso si está en una línea, ya que la legibilidad añadida será beneficiosa a largo plazo ... 'if (! Defined ('BASE_PATH')) define ('BASE_PATH', '/ mnt/www/');' es solo * 3 caracteres * más largo que esta versión condensada, y lo compensa con creces en legibilidad. – rid

5

En C, #ifdef menudo implica la escritura de código/activación/desactivación personalizada en función de si una definición existe o no. Aunque el OP no estaba buscando la respuesta que sigue, los usuarios de los motores de búsqueda pueden estar interesados ​​en obtener una respuesta expandida. (Esta pregunta me ayudó a RTM a encontrar la respuesta que sigue.)

Si uno tiene un archivo .php que se incluye varias veces, puede ser conveniente declarar una función solo si no se ha declarado anteriormente. del mismo archivo. Conveniencia, en este caso, es mantener el código relacionado estrechamente en el mismo archivo en lugar de tener que ponerlo en un archivo separado y include_once .php código innecesariamente separado que no está destinado a ser generalmente reutilizado en otros contextos (archivos).

Puesto que parece un desperdicio/inadecuada para volver a declarar funciones múltiples veces, resulta que un #ifdef-como constructo en PHP es posible:

if (! function_exists('myfunc')) 
{ 
    function myfunc(...) 
    { 
    ... 
    } 
} 

Dónde ... indica su terraplén-en-el blanco.

Consulte también: function_exists (PHP 4, PHP 5) (w/comentarios).

+0

Parece que las variables globales no son visibles desde myfunc(), por lo que las referencias deben pasarse como argumentos (según sea necesario). – kbulgrien

+0

su código es sintácticamente incorrecto – zerkms

+0

Sí, tenía un punto y coma al final de la declaración if (y ahora se ha ido) pero los '...' se describen claramente en el cuerpo de la respuesta. El código es una copia/pega de algo en un sitio web real, solo reemplacé los argumentos y el cuerpo de la función con '...' y cambié el nombre de la función. – kbulgrien

Cuestiones relacionadas