2010-04-17 7 views
5

Estoy usando un archivo separado para todas las constantes de mi aplicación PHP.Declaración de constantes PHP basada en la condición

class constants 
{ 
    const USERNAME = 'abc'; 
    /* 
     ⋮ 
    */ 
} 

Para digamos USERNAME constante, el valor puede ser xyz o abc basado en el archivo existe cheque. Si el archivo xyz existe USERNAME, el valor sería xyz. ¿Cómo puedo hacer este control en mi clase de constantes?

Respuesta

5

Si el valor de la constante es variable, entonces no es una constante, sino una variable.

Dado que intenta (correctamente) mantener sus aplicaciones encapsuladas y alejadas del alcance global, puede interesarle el patrón de registro. Un Registro es básicamente una matriz glorificada que almacena todo lo que arroja y es accesible a nivel global a través de su aplicación.

Algunos recursos:


EDIT Si está realmente desesperada y tiene que tener la constante redefinición, puede utilizar

runkit ya definidos pueden no estar disponibles si usted está en alojamiento compartido y considero que lo necesiten un olor código, pero aquí está cómo te básicamente lo hace (en su bootstrap)

if (file_exists('xyc')) { 
    runkit_constant_redefine('Constants::USERNAME', 'xyz'); 
} 

EDITAR Algunos más opciones (todo lo cual no es exactamente muy bien):

class Abc { const FOO = 1; const BAR = 2; } 
class Xyz extends Abc { const FOO = 2; } 
class_alias(file_exists('abc') ? 'Abc' : 'Xyz', 'Constants'); 

Para esto, se cambie el nombre de la clase constantes actual a Abc y añadir una segunda clase Xyz para extender y sobrescribir la constante NOMBRE DE USUARIO (FOO en el ejemplo). Esto obviamente rompería su código, porque solía hacer Constants::USERNAME, por lo que debe crear un alias para el nombre de la clase anterior. A qué clase de constantes apuntará, se decide con la verificación condicional. Esto requiere PHP5.3.

A pre-5.La solución 3 sería simplemente guardar el archivo de la clase Constants con dos nombres diferentes, p. abc_constants.php y xyz_constants.php, modifique el último para mantener USERNAME xyz y luego include, o bien dependiendo de la comprobación del archivo.

O reemplace el valor de USERNAME con un marcador de posición y en lugar de incluir la clase, la carga en una variable como una cadena. A continuación, reemplace el marcador de posición de acuerdo con el resultado de la comprobación de archivos y eval de la cadena, incluyendo efectivamente la clase de esta manera.

Pero tengo que decirlo de nuevo: sugiero que refactorice su código para usarlo.

+1

No dijo que era variable, dijo que era condicional, por lo que existe la función de definición. –

+0

@NSD el OP explícitamente * para permite decir constante de USERNAME, el valor puede ser xyz o abc *. ¿Cómo es eso no es variable? – Gordon

+0

Como suele ser el caso en SO, la pregunta fue editada por alguien que no le prestó mucha atención. Lo que realmente dijo fue que se definió de forma condicional en función de si existía o no un archivo. Dado que es poco probable que este archivo se cree y elimine repetidamente en el tiempo de ejecución, esto es excesivo a menos que solo desee impresionar a su jefe con el recuento de líneas al final del día. –

0

¿No es esto: PHP Readonly Properties? acercamiento más fácil?

Me parece que intentas utilizar indebidamente las constantes.

+0

En realidad, cuando diseñé la aplicación, se suponía que solo había un valor para una constante. Y para hacer un solo archivo constante para todas las constantes me pareció un enfoque simple. Y ahora debido a algunos cambios de requisitos, puede variar según el archivo existente. No puedo cambiar ahora el archivo de constantes ya que también tengo que admitir la compatibilidad con versiones anteriores. –

+0

Ya veo. ¿Bien y variantes de archivo con clase de constantes? Si solo es una cuestión de USERNAME, estará bien. De lo contrario, no se puede usar. O la función eval puede hacer el truco. –

+0

¿cómo eval sería útil aquí? –

0

http://us2.php.net/manual/en/function.define.php

if ($file_exists) 
{ 
    define('MYCONSTANT', 'YEAH'); 
} 
else 
{ 
    define('MYCONSTANT', 'NOPE'); 
} 
+0

No, no debería, porque es la respuesta a su pregunta. –

+0

@NSD no, no lo es. No puedes usar define en una clase. Y establecer valores constantes condicionalmente es utilizar indebidamente las constantes para las variables. – Gordon

+0

Puede usarlo en un método de clase, como un constructor. Mismo efecto, menos ruido. Siguiente argumento? –

0

No es posible hacer que las definiciones constantes condicionales dentro de clases.

+0

Sí, sé de esto, pero estoy buscando algo de trabajo alrededor de este problema –

Cuestiones relacionadas