2010-08-26 16 views
36

C'è una best practice/raccomandazione quando voglio usare una variabile dichiarata al di fuori di una funzione quando si tratta di utilizzare:

  1. global $myVar
  2. $GLOBALS['myVar']

Grazie.

risposta

33

Quello che dovresti fare è passare la variabile alla funzione invece di usare un globale.

Un esempio come cambiare una variabile dall'esterno della funzione tramite trasferirla come parametro di riferimento:

function myFunc(&$myVar) 
{ 
    $myVar = 10; 
} 

$foo = 0; 
myFunc($foo); 
var_dump($foo); // yields 10 
+3

Ho bisogno di modificare una variabile esterna. – Francisc

+1

@Francisc Se lo vuoi davvero, puoi passarlo per riferimento. – Artefacto

+1

Ho allegato un esempio per dimostrare di utilizzare un riferimento come Artefacto suggerito. –

3

Vorrei andare per il globale nella parte superiore della vostra funzione. In questo modo, puoi facilmente vedere quali sono i globali utilizzati.

+2

Tranne quando la funzione è lunga (ad esempio una grande istruzione switch), e ora non si sa cosa sia globale e cosa no. Puoi dichiarare quali globali usi con un phpdoc ('@ global'). – Artefacto

3

I wold dico, si consiglia di non utilizzare Globals in OOP, ci dovrebbe sempre essere un modo migliore

69

Beh, si dovrebbe utilizzare solo variabili globali in circostanze limitate, ma per rispondere alla tua domanda:

  1. global è potenzialmente marginalmente più veloce (si rar ely fa la differenza).
  2. $GLOBALS (non $GLOBAL) è più leggibile, perché ogni volta che lo vedi, sai che stai accedendo/modificando una variabile globale. Questo può essere cruciale per evitare cattivi bug.
  3. All'interno di una funzione, se si desidera annullare l'impostazione di una variabile globale, è necessario utilizzare unset($GLOBALS['varname']), non global $varname; unset($varname);.

Per quanto riguarda i punti 1 e 2, io quote Sara Golemon qui:

Che cosa significa questo per l'uso della matrice $GLOBALS? Esatto, la parola chiave global è tecnicamente più veloce. Ora, voglio essere veramente chiaro su una cosa qui. La minore velocità offerta dall'uso dei globali come variabili [compilate] localizzate deve essere seriamente valutata rispetto alla manutenibilità di guardare il codice in cinque anni e sapere che $foo proviene dall'ambito globale. something_using($GLOBALS['foo']); saranno sempre più chiaro a voi la linea di global $foo; /* buncha code */ something_using($foo); Non essere penny-saggio e sterlina sciocco ..

+3

Molto utile, grazie. – Francisc

+1

Sono d'accordo con te, $ GLOBALS è molto meglio di "globale" – Stef

+11

+1 per rispondere effettivamente alla domanda che è stata posta. Globali potrebbero non essere le migliori pratiche, ma a volte dobbiamo lavorare con loro (WordPress, chiunque?). – Mark

0

global $var; è equivalente a $var =& $GLOBALS['var'].

Alcune persone hanno suggerito che è più veloce rispetto all'utilizzo di $GLOBALS, tuttavia non è necessariamente il caso. Se si utilizza la variabile solo una volta, $GLOBALS sarà più veloce, perché non si perde tempo per l'assegnazione.

Tuttavia, se si utilizza la variabile più volte, l'utilizzo di global (o dell'assegnazione equivalente) è più veloce, poiché la ricerca della matrice per la chiave var viene eseguita una sola volta.

Questo è tutto sulla velocità. Tuttavia, la differenza di velocità è veramente piccola e la leggibilità è più importante.Tuttavia, diverse persone hanno preferenze diverse sulla leggibilità: preferisco lo global, altre persone che rispondono qui preferiscono lo $GLOBALS, quindi spetta a te decidere cosa sembra migliore.

+0

I tuoi primi due paragrafi sono sbagliati. Bene, il primo è metà sbagliato. È semanticamente equivalente, ma non si traducono negli stessi opcode e 'global $ var' è più veloce di' $ var = & $ GLOBALS ['var'] '.Il secondo paragrafo è semplicemente sbagliato. – Artefacto

+0

@Artefacto: Hm, ho pensato che fossero davvero equivalenti. Grazie per avermelo segnalato, cercherò di trovare maggiori informazioni a riguardo. – Mewp

+1

Per quanto riguarda, il secondo è sbagliato, esegui "Codice profilo" su questo http://codepad.viper-7.com/roRI8g Vedrai che 'global' è solo una ricerca hash più memoria in una variabile compilata. La variante '$ GLOBALS' comporta due ricerche hash. Non è memorizzato in alcuna variabile, ma non fa alcuna differenza rispetto all'archiviazione in una variabile compilata, dal punto di vista delle prestazioni. – Artefacto

Problemi correlati