2011-08-07 10 views
8

Tengo un archivo php en el que necesito poder activar fácilmente un interruptor. El interruptor está configurado en 1 para el servidor local y 0 para el servidor de producción. local_on = '1'; o local_on = '0' ;. ¿Qué camino es mejor (crear un global o usar definir)? Si de cualquier manera es bueno, ¿cuál es la mejor práctica?Global vs. Define

+0

Estaba a punto de responder 'define' cuando 3 personas que escriben más rápido lo hicieron antes que yo. Haz lo que dijeron. – cspray

+0

es más semántico usar verdadero/falso en lugar de '1'/'0' – RiaD

+1

Relacionado: http://stackoverflow.com/questions/1412557/identify-development-vs-production-server-in-php – karim79

Respuesta

9

define. No puede cambiar su valor más tarde, y su valor siempre está disponible en todos los ámbitos, de forma tersa.

1

Ambos funcionan bien siempre y cuando recuerde elegir un nombre distintivo (mayúscula para define s) y utilice la forma moderna de acceder a variables globales a través del $GLOBALS superglobal (sic). Además, las variables globales son, bueno, variable, por lo que podría, en teoría, cambiar su valor por accidente más o menos.

para simplificar la implementación y no conectar o desconectar el interruptor por accidente, me gustaría recomendar automáticamente la configuración de forma automática mediante el examen de las propiedades de $_SERVER, como

// Turn on debugging code on local machine 
define('MYPAGE_LOCAL_ON', $_SERVER['SERVER_NAME'] == 'my-dev-box'); 

Además, no veo por qué' d establecer el cambio a una cadena o un entero para ese asunto. El boolean valuestrue y false parecen más apropiados.

+0

woa .. agradable ... algunas mejoras al siguiente nivel ... ¡gracias! –

10

Una variable global es, como su nombre indica, variable - lo que significa que su parte puede cambiar su valor; que, en tu caso, probablemente no es lo que quieres.

Por otro lado, una constante (que deberá definir con define) es ... bueno ... constante; y, como tal, no se puede modificar una vez establecido; que es probablemente lo que quieres, en tu caso.


Considerando la idea de variable frente a constante, para este tipo de conmutadores, generalmente uso define() y constantes.

+0

Definir símbolos y constantes son cosas realmente diferentes. – grantwparks

4

La definición es la mejor opción de las dos, porque las variables globales son malas noticias por razones que estoy seguro que ya conoce, y porque debe recordar declarar global $var en cada función y método en su código . Las constantes definidas están automáticamente disponibles en todas partes. Además, una variable podría establecerse inadvertidamente de un estado a otro durante la ejecución de su secuencia de comandos. Esto podría causar algunos errores realmente difíciles de encontrar si ocurriera.

+5

"porque debe recordar declarar' global $ var' en cada función y método en su código "// No, no es así. –

1

Prefiero define. Razones:

  • No se pueden redefinir de manera accidental
  • se pueden utilizar en otras alcance (ex funciones.) Sin feas $ GLOBALS construcción

PD: a partir de PHP 5.3 se puede utilizar const, no solo define para declarar constantes. Es más legible para mí

0

En pocas palabras, define es lo que buscas (for said reasons).

Sin embargo, en el desarrollo futuro, es posible que busque algo así como una dependencia para toda su aplicación, siempre que el contexto en el que se está ejecutando.Esto no se puede hacer con constantes, entonces define pero al igual que las variables globales son incorrectas.

2

Otra forma en que realiza un poco mejor que definir símbolos y minimiza las colisiones de nombres es una declaración de clase como

abstract config { 
    const LOCAL = true; // toggle to false 
// or maybe 
    const SERVER = 'local'; // toggle to 'remote' 
// (maybe having if (config.SERVER == 'remote') would be more readable in some 
// cases than if (!config.LOCAL) depends on your app) 
} 
+1

i thing 'if (! DEBUG_MODE)' es lo suficientemente legible – RiaD

+0

the! parte es una cuestión de gusto dependiendo del contexto. El uso de una clase const en lugar de una definición es categóricamente mejor por razones de código y eficiencia. – grantwparks

+0

const valuename = 'smth' está disponible fuera de clase desde 5.3 también. Creo que las razones de eficiencia no son reales aquí. De todos modos, estoy de acuerdo en que la clase hace que el código sea más preciso si hay más de 1 constante – RiaD

Cuestiones relacionadas