2012-11-23 46 views
117

Ho codice qualcosa di simile:Come dichiarare una variabile globale in php?

<? 
    $a="localhost"; 
    function body(){ 
     global $a; 
     echo $a; 
    } 

    function head(){ 
     global $a; 
     echo $a; 
    } 

    function footer(){ 
     global $a; 
     echo $a; 
    } 
?> 

c'è un modo per definire la variabile globale in un unico luogo e rendere la variabile $a accessibile in tutte le funzioni in una sola volta? senza fare uso di global $a; di più?

+11

No, non c'è. Se non ti piace la parola chiave 'global', considera l'uso di' $ GLOBALS ['a'] 'superglobale in tutti gli ambiti, o considera di passare il parametro alle tue funzioni. –

+3

Se è qualcosa di importante, può essere utilizzata anche una variabile di sessione. –

risposta

183

L'array $GLOBALS può essere usato al posto:

$GLOBALS['a'] = 'localhost'; 

function body(){ 

    echo $GLOBALS['a']; 
} 

Dal Manual:

Un array associativo contenente riferimenti a tutte le variabili che sono attualmente definiti nel ambito globale della sceneggiatura. I nomi delle variabili sono le chiavi dell'array.


Se si dispone di un insieme di funzioni che hanno bisogno di alcune variabili comuni, una classe con proprietà può essere una buona scelta al posto di un globale:

class MyTest 
{ 
    protected $a; 

    public function __construct($a) 
    { 
     $this->a = $a; 
    } 

    public function head() 
    { 
     echo $this->a; 
    } 

    public function footer() 
    { 
     echo $this->a; 
    } 
} 

$a = 'localhost'; 
$obj = new MyTest($a); 
+6

+10. Questo funziona perfettamente. –

+4

+2 per averlo incluso in una classe invece di dover gestire la sintassi fastidiosa globale! –

+0

+100 ha funzionato anche per me –

4

Hai risposto a questo nel modo in cui hai scritto la domanda - usa 'define'. ma una volta impostato, non è possibile modificare una definizione.

In alternativa, ci sono trucchi con una costante in una classe, come class :: constant che è possibile utilizzare. Puoi anche renderli variabili dichiarando proprietà statiche alla classe, con le funzioni per impostare la proprietà statica se vuoi cambiarla.

57

Se la variabile non sta per cambiare è possibile utilizzare define

Esempio:

define('FOOTER_CONTENT', 'Hello I\'m an awesome footer!'); 

function footer() 
{ 
    echo FOOTER_CONTENT; 
} 
+0

Cosa succede quando si tenta di modificare FOOTER_CONTENT? È come 'final' in Java o' const' in C, C++ e C#? – Lion

+2

Se si prova a definire FOOTER_CONTENT una seconda volta, php invierà un avviso a riguardo – Dale

+0

Avevo bisogno di calcolare l'ora corrente unix ogni volta che viene caricata una pagina, quindi utilizzare quel valore in un paio di calcoli (funzioni). "define" ha funzionato per me. Inizialmente, non ho visto "echo FOOTER_CONTENT;" non ho avuto un precedente $ e ho avuto errori. – user208145

23

Aggiungere le variabili in $ GLOBALS serie super-globale come

$GLOBALS['variable'] = 'localhost'; 

e usarlo a livello globale

oppure è possibile utilizzare costante che sono l'accesso bile in tutta la sceneggiatura

define('HOSTNAME', 'localhost'); 
+0

Se si utilizza 'define', una volta impostato, non è possibile modificare un define! –

+0

nel tuo primo esempio, sta dicendo che la variabile $ è ora chiamata 'localhost' più avanti nello script? – HollerTrain

+0

no se vuoi usare questa variabile devi usarla come $ GLOBALS ['variable']; –

-16

Non dovrebbe usare variabili globali più, non sono disponibili in PHP 5.4.

+13

REGISTER GLOBALS è stato rimosso. non globali. – unity100

+4

Questa risposta, come scritto, è errata e dovrebbe essere aggiornata per riflettere il commento di unity100. Se GLOBALS è ancora disponibile, ti preghiamo di chiarire quali aspetti dei VAR GLOBAL sono stati modificati. [Qualcosa di simile.] (Http://stackoverflow.com/questions/10158140/php-5-4-0-register-globals-deprecated#answer-10158165) – crashwap

+0

http://php.net/manual/en/ security.globals.php – m13r

5

Questa risposta è molto in ritardo, ma quello che faccio è impostare una classe che contenga valori booleani, array e interi-interi come variabili statiche per l'ambito globale. Qualsiasi stringa costante è definita come tale.

define("myconstant", "value"); 

class globalVars { 

    static $a = false; 

    static $b = 0; 

    static $c = array('first' => 2, 'second' => 5); 

} 


function test($num) { 

    if (!globalVars::$a) { 

     $returnVal = 'The ' . myconstant . ' of ' . $num . ' plus ' . globalVars::$b . ' plus ' . globalVars::$c['second'] . ' is ' . ($num + globalVars::$b + globalVars::$c['second']) . '.'; 

     globalVars::$a = true; 

    } else { 

     $returnVal = 'I forgot'; 

    } 

    return $returnVal; 

} 

echo test(9); ---> The value of 9 + 0 + 5 is 14. 

echo "<br>"; 

echo globalVars::$a; ----> 1 

I static parole chiave devono essere presenti nella classe altrimenti i vars $ a, $ b, e $ c non saranno un ambito globale.

4

È possibile provare la parola chiave use in Chiusura funzioni o Lambda se questo si inserisce la vostra intenzione ... PHP 7.0 però. Non è meglio, ma solo un'alternativa.

$foo = "New"; 
$closure = (function($bar) use ($foo) { 
    echo "$foo $bar"; 
})("York"); 

demo | info

1

Una variabile dichiarata fuori da una funzione ha una portata globale e si può accedere solo al di fuori di una funzione

<?php 
global $a; 
$a=10; 
echo $a; 
function xl($a){ 
echo "in the function".$a." <br/>"; 
} 
echo "in outside ".$a."<br/>"; 
xl($a); 
?> 
Problemi correlati