2010-01-13 8 views

Respuesta

15

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.

+0

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

+1

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

+4

@Gal, sí, este es un buen motivo para usarlos, ya que no va a cambiar directorios en tiempo de ejecución. – GSto

2

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.

+0

Quiero usar constantes para poder pasar nombres de directorio. – Gal

+0

Si no se espera que el valor del directorio cambie, entonces use una constante :) – Sampson

8

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.

+0

Las constantes siguen siendo malas entonces? ¿Debo usar sesiones para pasar cosas como nombres de directorios y cosas por el estilo? Las constantes – Gal

+0

no son solo 'menos malas'. son una cosa perfectamente aceptable de usar en muchos casos, como lo que Gal dice sobre los directorios. – GSto

+0

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. –

6

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.

1

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'); 

?> 
-1

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.

0

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!

0

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.

Cuestiones relacionadas