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
Respuesta
define
. No puede cambiar su valor más tarde, y su valor siempre está disponible en todos los ámbitos, de forma tersa.
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.
woa .. agradable ... algunas mejoras al siguiente nivel ... ¡gracias! –
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.
Definir símbolos y constantes son cosas realmente diferentes. – grantwparks
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.
"porque debe recordar declarar' global $ var' en cada función y método en su código "// No, no es así. –
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í
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.
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)
}
i thing 'if (! DEBUG_MODE)' es lo suficientemente legible – RiaD
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
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
- 1. Configuración de #define global en XCode
- 2. Cómo # #define un NSString para uso global?
- 3. #Define VS variable
- 4. const string vs. #define
- 5. estática const vs #define
- 6. Ámbito global vs espacio de nombres global
- 7. Estático vs global
- 8. ASP.NET MVC Session vs Global vs Cache
- 9. Ventaja y desventajas de #define vs. constants?
- 10. #define MY_INT VS const int MY_INT
- 11. #define vs. enums para direccionar periféricos
- 12. de usar cadena estática vs #define
- 13. C: enum VS #define para constantes matemáticas?
- 14. Método de clase global vs función vs clase estática
- 15. Cierre de JavaScript vs. variable global
- 16. MySql 'wait_timeout' Variable global vs Variable
- 17. Recurso global vs. Recurso local en ASP.NET
- 18. MySQL wait_timeout Variable - GLOBAL vs SESSION
- 19. C++ singleton vs. objeto estático global
- 20. C++ define un modo de lanzamiento 'mejor' incorporar VS
- 21. #define vs enum en un entorno incrustado (¿Cómo compilan?)
- 22. Pros/contras de un objeto observador global vs. una mixin
- 23. ¿Qué es mejor: secuencia global única vs. secuencia por tabla?
- 24. variable estática global vs variable estática en la función?
- 25. ¿Cómo se define threadsafe?
- 26. ¿Cuál es la diferencia entre `key`-global-set y` define-key-map` mundial en Emacs
- 27. Haga que Firebug se rompa cuando se define una variable global x
- 28. Constante global Codeigniter
- 29. Cómo crear enum global
- 30. Javascript Global Objects
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
es más semántico usar verdadero/falso en lugar de '1'/'0' – RiaD
Relacionado: http://stackoverflow.com/questions/1412557/identify-development-vs-production-server-in-php – karim79