2009-12-15 15 views
6

Esiste un modo per rendere globali tutte le variabili?Rendi globali tutte le variabili, PHP

+31

Si prega di non :( –

+1

Se è davvero poco pratico impostare una variabile globale in una funzione generica, è sempre possibile utilizzare l'array $ GLOBALS (cioè $ GLOBALS ['var_name']) – Bretticus

risposta

9

Non importa quello che stai cercando di fare, ma questo è un cattivo modo di andare su di esso. Farai molto meglio semplicemente passare le variabili come argomenti alle funzioni o dichiarandole globali lì.

ma in breve, non esiste un modo semplice per farlo senza un sacco di dichiarazioni globali.

8

modo rapido e sporco:

$GLOBALS += get_defined_vars(); 

non so se questo hack è portatile (funziona su PHP 5.3.1) e ho il sospetto gli oggetti vengono clonati.

+1

L'oggetto non deve essere clonato , ma non funziona con l'aliasing, ma direi che è piuttosto vicino, e altre cose hanno più overhead: http://stackoverflow.com/a/10980563/367456 (Aggiunta la risposta per motivi di completezza) – hakre

5

penso che questo può aiutare foreach($GLOBALS as $name => $value) global $$name; metterlo all'interno della funzione e si avrete tutte le variabili definite visibles

15

Per importare tutte le variabili globali incl. superglobals e contrastanti nomi dei parametri nel campo di applicazione funzioni:

extract($GLOBALS, EXTR_REFS | EXTR_SKIP); 

Il problema è con il superglobals qui. Si potrebbe desiderare di escluderli, ecco un elenco (PHP 5.2):

/** 
* PHP Superglobals 
*/ 
array (
    1 => 'GLOBALS', 
    2 => '_ENV', 
    3 => 'HTTP_ENV_VARS', 
    4 => '_POST', 
    5 => 'HTTP_POST_VARS', 
    6 => '_GET', 
    7 => 'HTTP_GET_VARS', 
    8 => '_COOKIE', 
    9 => 'HTTP_COOKIE_VARS', 
    10 => '_SERVER', 
    11 => 'HTTP_SERVER_VARS', 
    12 => '_FILES', 
    13 => 'HTTP_POST_FILES', 
    14 => '_REQUEST', 
    15 => 'HTTP_SESSION_VARS', 
    16 => '_SESSION', 
) 

si ottiene il parametro nomi di variabili con get_defined_vars.

Questo è anche il motivo per cui l'opposto è meno complicato, get_defined_vars non restituisce i superglobali, solo le variabili locali.

Il global crea un riferimento alla variabile della portata globale, quindi è in realtà una variabile locale che è un alias per la variabile globale con lo stesso nome. Anche alcuni Vars locali si scontrano per l'esportazione, in modo da alcuni pre-precauzioni come i nomi delle variabili esoterici devono essere prese:

foreach(get_defined_vars() as ${"\x00\x00"} => ${"\x00\x01"}) 
{ 
    $GLOBALS[${"\x00\x00"}] =&$${"\x00\x00"}; 
} 

notare che, come globals la matrice superglobale $GLOBALS contiene i riferimenti alle variabili globali e, quindi questo crea riferimenti anche qui. Ciò è particolarmente necessario se si importa tramite global o &$GLOBALS[...] o extract come sopra. Oppure, se si dispone di variabili locali che sono alias per i membri della classe privata (non farlo;)):

Esempio/Demo:

<?php 
/** 
* Make all variables global, PHP 
* @link http://stackoverflow.com/q/1909647/367456 
*/ 
error_reporting(~0); 

function bar($goo = 1) 
{ 
    global $foo; 

    $foo++; 
    $baz = 3; 

    foreach(get_defined_vars() as ${"\x00\x00"} => ${"\x00\x01"}) 
    { 
     $GLOBALS[${"\x00\x00"}] =&$${"\x00\x00"}; 
    } 
} 

$foo = 1; 
bar(); 
echo '$goo: ', var_dump($goo); # int(1) 
echo '$foo: ', var_dump($foo); # int(2) 
echo '$baz: ', var_dump($baz); # int(3) 
+2

Sei un coraggioso coraggioso ;-) +1 – PeeHaa

2

È possibile semplice renderli un riferimento a $ GLOBALS

foreach($GLOBALS as $k => $v) 
    $$k=&$GLOBALS[$k]; 

Spiegazione del codice:

$ GLOBLAS è un VA superglobale Riable (visibile ovunque).Fondamentalmente contiene tutte le variabili


$$ significa la variabile con il nome del valore della variabile che hai scritto

po 'strano da spiegare in una lingua straniera ecco un esempio:

$color='blue'; 
$blue='foo'; 

echo $$color; 

stamperà

foo 

$k=& $v; 

significa che $ k è un riferimento a $ v

0

Questo non è davvero una buona pratica per fare tutte le variabili globali in termini di sicurezza. Per aggiungere variabili come globali dovrai aggiungere la parola chiave GLOBAL ogni volta che accederai. Un approccio alternativo è l'uso dell'array $ GLOBAL.