C'è una best practice/raccomandazione quando voglio usare una variabile dichiarata al di fuori di una funzione quando si tratta di utilizzare:
global $myVar
$GLOBALS['myVar']
Grazie.
C'è una best practice/raccomandazione quando voglio usare una variabile dichiarata al di fuori di una funzione quando si tratta di utilizzare:
global $myVar
$GLOBALS['myVar']
Grazie.
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
Vorrei andare per il globale nella parte superiore della vostra funzione. In questo modo, puoi facilmente vedere quali sono i globali utilizzati.
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
I wold dico, si consiglia di non utilizzare Globals in OOP, ci dovrebbe sempre essere un modo migliore
Beh, si dovrebbe utilizzare solo variabili globali in circostanze limitate, ma per rispondere alla tua domanda:
global
è potenzialmente marginalmente più veloce (si rar ely fa la differenza).$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.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 chiaveglobal
è 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 diglobal $foo; /* buncha code */ something_using($foo);
Non essere penny-saggio e sterlina sciocco ..
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.
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
@Artefacto: Hm, ho pensato che fossero davvero equivalenti. Grazie per avermelo segnalato, cercherò di trovare maggiori informazioni a riguardo. – Mewp
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
Ho bisogno di modificare una variabile esterna. – Francisc
@Francisc Se lo vuoi davvero, puoi passarlo per riferimento. – Artefacto
Ho allegato un esempio per dimostrare di utilizzare un riferimento come Artefacto suggerito. –