2011-06-23 13 views
36

¿Se puede definir o cambiar una constante en PHP?¿Puedes undefine o cambiar una constante en PHP?

+41

En otras palabras, ¿quieres que una constante sea una variable? Puede que quieras pensar en esto por un tiempo más. –

+4

@MarcB pero apropiado, dado el nombre de usuario de OP. – abligh

+0

@MarcB El OP claramente reconoció la ironía de la pregunta (él/ella hizo una cuenta solo para publicar esta pregunta), pero lo planteó seriamente. Suena más razonable planteado como _ "¿Se puede definir una de las cosas que los creadores de PHP decidieron llamar 'constantes'?" _ –

Respuesta

10

No. Una vez que una constante se define, nunca se puede cambiar o indefinido.

+1

Esto es incorrecto. La extensión runkit (como se menciona en otra respuesta) lo ha permitido desde PHP 4. Más recientemente, la extensión uopz también lo permite desde PHP 5.4. –

14

Si es absolutamente necesario para hacer esto (aunque yo no lo recomendaría como otros han dicho) siempre se puede utilizar Runkit.

http://www.php.net/manual/en/function.runkit-constant-redefine.php

http://www.php.net/manual/en/function.runkit-constant-remove.php

+22

Tonterías como esta es una de las razones por las cuales hay tanto código PHP malo por ahí. Subvertir los constructos de lenguaje de tal manera es una idea terrible, y se refleja pobremente en el desarrollador que lo hace. –

+2

Runkit es una extensión PHP opcional, que nunca he visto instalada en ningún host web. – gnud

+10

@George Cummins Estoy de acuerdo contigo allí! Aún así, el OP no mencionó lo que estaban haciendo o por qué deseaban desarmar/redefinir las constantes, y otros pueden estar buscando algo como Runkit para algunas cosas muy experimentales de piratería de idiomas, así que pensé en publicarlo. –

4

Los otros carteles son correctos - no se puede hacer esto. Pero tal vez puedas mover tu definición al punto donde sepas cuál sería el mejor valor para la constante.

Tal vez se está definiendo constantes en una gran lista:

define('STRING1','Foo'); 
define('STRING2', 'Bar'); 
define('STRING3', 'Baz'); 

y que desea cambiar el valor de STRING2 vez que se descubre una condición. Una forma sería postergar la definición hasta que conozca la configuración correcta.

define('STRING1','Foo'); 
// define('STRING2', 'Bar'); -- wait until initialization 
define('STRING3', 'Baz'); 

... 


if (condition) { 
    define('STRING2', 'Bar type 2'); 
} else { 
    define('STRING2', 'Bar type 1'); 
} 

La lógica de ajuste STRING2 podría incluso estar en un archivo diferente, más tarde en su procesamiento.

18

Sé que es tarde para el juego ... pero aquí es una cosa que puede ayudar a algunas personas ...

En mi archivo "Application.php" (donde defino todos mis constantes e incluir en todos mis scripts) que hago algo como esto:

if(!defined("LOGGER_ENABLED")){ 
define("LOGGER_ENABLED", true); 
} 

Así que normalmente, cada guión va a obtener registro habilitado ... pero si en un script en particular no quiero este comportamiento simplemente me puedo hacer esto antes Incluyo mi Application.php:

define("LOGGER_ENABLED", false); 
+0

Sin ver toda su aplicación esto puede ser una suposición injusta, pero "anular" su propio sistema suena un poco hacky. ¿No puedes rediseñar tu aplicación/framework para administrar mejor si Logger debería estar habilitado o no basado en algo más específico o lógico? Tal como están las cosas, esto suena muy complicado de usar y administrar, y sobre todo para algo que suena como que se usa con poca frecuencia. Es una respuesta válida que agrega información potencialmente útil para la pregunta, por lo que no baja el voto, pero potencialmente promueve malas prácticas. – James

+0

@patrick, sí, pero ¿y si alguien quiere cambiar el valor que ya están configurados, por eso creo que la respuesta de Nils Luxton es la que mejor se adapta a ella? Espero que te acuerdes de mí. –

+2

Esto debe aceptarse porque ofrece una solución que funciona. También es una práctica habitual en, por ejemplo. C codificación, por lo que no veo que sea un problema para ser utilizado en PHP – Sinisa

4

Como no se menciona en ninguna otra parte, la extensión uopz permite borrar una constante mediante uopz_undefine(), para PHP 5.4+.

+1

Votantes abajo: Si lo que escribí es incorrecto, ¡POR FAVOR DIGA o corrija! –

Cuestiones relacionadas