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.
No dijo que era variable, dijo que era condicional, por lo que existe la función de definición. –
@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
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. –