2010-01-13 4 views

risposta

15

Sono correlati in quanto hanno portata globale, ma le costanti non sono modificate una volta definite, a differenza delle variabili globali che la pagina può modificare man mano che procede. Quindi, passare a usare define() anziché a global non sarà di grande aiuto.

È meglio se si refactoring i metodi per prendere le variabili come parametri e si basano su quello per passare le variabili in giro.

+0

Voglio avere alcune variabili preimpostate come i nomi delle directory che sarebbero globali e accessibili dappertutto. Voglio anche che le variabili globali siano disabilitate. Posso usare define() in questo caso? – Gal

+1

Se non si intende modificare la variabile mentre la pagina viene eseguita, allora sì, questo è l'uso corretto per definire. – Parrots

+4

@Gal, sì, questo è un buon motivo per usarli, dato che non cambierai le directory in fase di esecuzione. – GSto

2

Le costanti, una volta definite, non possono essere modificate.

Non utilizzare le costanti come variabili. Se è necessario utilizzare le variabili all'interno delle funzioni, passarle nella funzione stessa. Usa tutto nel modo in cui era destinato a essere usato. Le variabili sono variabile e le costanti sono costante.

+0

Desidero utilizzare le costanti per poter passare attorno ai nomi delle directory. – Gal

+0

Se non si prevede che il valore della directory cambi, quindi utilizzare sempre una costante :) – Sampson

8

Alcune cose qui.

Innanzitutto, register_globals disattivato nel php.ini fa riferimento a una vecchia funzionalità PHP in cui qualsiasi variabile inviata tramite una stringa di query (GET) o una forma (GET/POST) verrebbe convertita in una variabile PHP globale. Questa è la funzionalità che è (e dovrebbe essere) disabilitata quando si disattiva register_globals. Anche con questa opzione, puoi ancora definire variabili globali nella tua applicazione.

In termini di programmazione generale, le variabili globali (non i register_globals di PHP) sono considerate "cattive" perché quando ne si incontra uno come programmatore, non si ha idea di quali altre parti dell'applicazione potrebbero essere utilizzate o modificate, o quale effetto le tue modifiche a quella globale potrebbero avere. Inoltre, se stai definendo una nuova variabile globale, c'è la possibilità di sovrascrivere una variabile esistente su cui fa affidamento qualcun altro. Quando le variabili sono definite localmente (in una singola funzione, o in altri linguaggi in un unico blocco) è possibile esaminare l'ambito locale e in genere determinare quale cambiamento effettuerà una variabile.

Le costanti, d'altra parte, non cambiano mai. Li definisci una volta e rimangono definiti e nessuno può cambiarli. Ecco perché avere costanti globali è considerato "meno cattivo" di avere variabili globali.

+0

Le costanti sono ancora cattive? Dovrei usare le sessioni per far passare cose come i nomi delle directory e simili? Le costanti – Gal

+0

non sono solo "meno male". sono una cosa perfettamente accettabile da usare in molti casi, come quello che sta dicendo Gal riguardo alle directory. – GSto

+0

Le costanti vanno bene, anche se troverai argomenti convincenti che non dovresti usare le costanti nello spazio dei nomi globale (ad esempio, solo le costanti di classe pensate siano usate). Non c'è una risposta giusta qui, solo risposte con diversi compromessi. –

6

Le variabili globali non sono costanti (è possibile modificare il valore di una variabile globale, ma è possibile definire una costante solo una volta).

Le costanti non sono sempre globali (è possibile dichiarare una costante in una classe).

Inoltre, le variabili globali possono essere di qualsiasi tipo: scalare, matrice o oggetto. Le costanti possono essere solo scalari.

Non ho intenzione di dire che le costanti o le variabili globali siano buone o cattive. Se usati in modo appropriato, hanno entrambi benefici. Esistono problemi di sicurezza relativi alla funzionalità register_globals che sono separati dall'uso più generale dei globals.

1

Alcuni esempi costanti:

<?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

provare questo semplice test:

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"; 
?> 

quindi eseguire fileB. php e lo vedrai prima di te nclude fileA.php, SOMEVAL non è definito. Quindi, questo significa che prima di definire qualcosa, non sarà visibile allo script.

0

Qualcos'altro da considerare: le costanti non possono memorizzare oggetti come matrici o oggetti, mentre qualcosa definito da $ GLOBALS può essere di qualsiasi tipo di variabile. Quindi, in alcuni casi, se hai bisogno di qualcosa per essere globale ma non può essere memorizzata su una costante usando define(), potresti voler usare $ GLOBALS.

Inoltre, register_globals e $ GLOBALS NON sono la stessa cosa!

0

È possibile modificare la variabile globale all'interno della funzione se entrambi hanno lo stesso nome, poiché la variabile locale sostituisce la variabile globale ma non modifica il valore della variabile globale all'esterno.in costante se si desidera utilizzare la stessa variabile nome in diversi funzione che non ti è stata concessa e che ti dà un errore, perché definisce una volta e usato in tutto il programma e non puoi cambiare il valore di questa variabile in alcuna funzione o blocco è un valore fisso.