De acuerdo con muchas fuentes, register_globals (variables globales) debe ser deshabilitado en su php.ini. ¿Debo escribir define() en mi código y usar constantes si las variables globales están deshabilitadas? ¿Están esos relacionados?PHP -cuál es la diferencia entre las variables globales y las constantes
Respuesta
Se relacionan en que tienen alcance global, pero las constantes están destinadas a no cambiar una vez definidas, a diferencia de las variables globales que la página puede modificar a medida que avanza. Así que cambiar a usar define() en lugar de un global no ayudará mucho.
Es mejor si refactoriza sus métodos para tomar las variables como parámetros y confiar en eso para pasar variables.
Las constantes, una vez definidas, no pueden modificarse.
No use constantes como variables. Si necesita usar variables dentro de las funciones, páselos a la función en sí. Use todo en la forma en que fue diseñado para ser utilizado. Las variables son variable y las Constantes son constante.
Algunas cosas aquí.
En primer lugar, register_globals que deshabilita en su php.ini se refiere a una característica PHP antigua donde cualquier variable enviada a través de una cadena de consulta (GET) o forma (GET/POST) se convertiría en una variable global de PHP. Esta es la funcionalidad que está (y debe) desactivarse cuando desactivas register_globals. Incluso con esto apagado, aún puede definir variables globales en su aplicación.
En términos generales de programación, las variables globales (no register_globals de PHP) se consideran "malas" porque cuando se encuentra con uno como programador, no tiene idea de qué otras partes de la aplicación podrían estar usando o cambiándolo, o qué efecto sus cambios a ese global podrían tener. Además, si está definiendo una nueva variable global, existe la posibilidad de que sobrescriba una variable existente en la que otra persona confía. Cuando las variables se definen localmente (en una sola función, o en otros idiomas en un solo bloque) puede examinar el alcance local y generalmente determinar qué hará un cambio en esa variable.
Las constantes, por otro lado, nunca cambian. Los defines una vez, y se mantienen definidos y nadie puede cambiarlos. Es por eso que tener constantes globales se considera "menos malo" que tener variables globales.
Las constantes siguen siendo malas entonces? ¿Debo usar sesiones para pasar cosas como nombres de directorios y cosas por el estilo? Las constantes – Gal
no son solo 'menos malas'. son una cosa perfectamente aceptable de usar en muchos casos, como lo que Gal dice sobre los directorios. – GSto
Las constantes son correctas, aunque encontrará argumentos convincentes de que no debe usar constantes en el espacio de nombre global (es decir, solo se usaron las constantes de clase). Aquí no hay una respuesta correcta, solo respuestas con diferentes compensaciones. –
Las variables globales no son constantes (puede cambiar el valor de una variable global, pero solo puede definir una constante una vez).
Las constantes no son siempre globales (puede declarar una constante en una clase).
Además, las variables globales pueden ser de cualquier tipo: escalar, matriz u objeto. Las constantes solo pueden ser escalares.
No voy a decir que las constantes o las variables globales son buenas o malas. Cuando se usan apropiadamente, ambos tienen usos beneficiosos. Existen problemas de seguridad en la característica register_globals
que son independientes del uso más general de los globales.
Algunos ejemplos constantes:
<?php
// Certainly constant
define('MINUTES_PER_HOUR', 60);
define('DOZEN', 12);
// Constant, but specific to this application
define('GREETING', 'Dear %s');
define('TIMEOUT', 30);
// Configurable, but constant for this installation
define('DATABASE', 'mydb');
define('IMAGES_DIRECTORY', '/tmp/images');
// Not constant, or some other reason why can't be constant
$user = $_POST['userid'];
$days_of_week = array('Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su');
?>
Prueba esta sencilla prueba:
fileA.php:
<?php
define('SOMEVAL', 2);
?>
fileB.php:
<?php
if(defined('SOMEVAL')) echo SOMEVAL;
else echo "SOMEVAL does not exists\n";
include 'fileA.php';
if(defined('SOMEVAL')) echo 'SOMEVAL='.SOMEVAL;
else echo "SOMEVAL does not exists\n";
?>
A continuación, ejecute FILEB. php y verá eso antes que yo nclude fileA.php, SOMEVAL no está definido. Entonces, lo que esto significa es que antes de definir algo, no será visible para el script.
Algo más a tener en cuenta: las constantes no pueden almacenar cosas como matrices u objetos, mientras que algo definido como $ GLOBALS puede ser de cualquier tipo variable. Por lo tanto, en algunos casos, si necesita que algo sea global pero no se puede almacenar en una constante mediante el uso de define(), es posible que desee usar $ GLOBALS en su lugar.
¡Además, register_globals y $ GLOBALS NO son lo mismo!
Puede cambiar la variable global dentro de la función si ambas tienen el mismo nombre, porque la variable local anula la variable global pero no cambia el valor de la variable global fuera.en constante si desea usar la misma variable de nombre en diferentes función que no se le permite y da un error, porque define una vez y se utiliza en todos los programas y no puede cambiar el valor de esta variable en cualquier función o bloque, es un valor fijo.
- 1. ¿Cuál es la diferencia entre los punteros y las variables globales en C?
- 2. ¿Cuál es la diferencia entre macro constantes y variables constantes en C?
- 3. ¿Cuál es la diferencia entre las variables firmadas y las no firmadas?
- 4. Hacer todas las variables globales, PHP
- 5. ¿Cuál es la diferencia entre session_unset() y session_destroy() en PHP?
- 6. ¿Es posible enumerar todas las variables globales en PHP?
- 7. ¿Las constantes globales son un antipatrón?
- 8. ¿cuál es la diferencia entre las tareas AntCall y Ant?
- 9. cuál es la diferencia entre las plantillas y el polimorfismo
- 10. Cuál es la diferencia entre las funciones VarIsEmpty y VarIsEmptyParam
- 11. ¿Cuál es la diferencia entre las variables de enlace y la variable que ingreso usando &&?
- 12. Haciendo todas las variables globales
- 13. La ventaja/desventaja entre las variables globales y los parámetros de función en PHP?
- 14. Cuál es la diferencia entre $ (...) y `...`
- 15. ¿cuál es la diferencia entre las variables locales y de instancia en Java
- 16. ¿Cuál es la diferencia entre las variables de entorno `USER` y` USERNAME`?
- 17. ¿Cuál es la diferencia entre% TMP% y% TEMP% en las variables de entorno de Vista?
- 18. ¿La función php "header()" desarma las variables globales?
- 19. ¿Cuál es la diferencia entre php cli y php cgi?
- 20. Imprimir todas las variables globales/variables locales?
- 21. ¿Cuál es la diferencia entre "$^N" y "$ +"?
- 22. ¿Las variables de instancia son las nuevas variables globales?
- 23. ¿Cuál es la diferencia entre las funciones PHP iconv_strlen, mb_strlen y strlen?
- 24. ¿Cuál es la diferencia entre las extensiones de archivos php y html?
- 25. ¿Cuál es la diferencia entre los módulos en js y las clases en php?
- 26. Vim variables globales y mapleader
- 27. ¿Cuál es la diferencia entre las ediciones de Orientdb?
- 28. Cuál es la diferencia entre las licencias de código abierto
- 29. ¿Es posible redefinir las constantes de PHP?
- 30. ¿Cuál es la diferencia entre las interfaces IComparable e IEquatable?
Quiero tener algunas variables preestablecidas como nombres de directorio que serían globales y accesibles por todas partes. También quiero que las variables globales estén deshabilitadas. ¿Puedo usar define() en este caso? – Gal
Si no tiene la intención de modificar la variable a medida que se ejecuta la página, entonces sí, este es el uso adecuado para definir. – Parrots
@Gal, sí, este es un buen motivo para usarlos, ya que no va a cambiar directorios en tiempo de ejecución. – GSto