Come dichiarare una variabile globale in php?


168

Ho un codice simile a questo:

<?
    $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 posto e rendere la variabile $aaccessibile in tutte le funzioni contemporaneamente? senza fare uso di global $a;più?


15
No non c'è. Se non ti piace la globalparola chiave, considera l'utilizzo del $GLOBALS['a']superglobal in tutti gli ambiti o considera di passare il parametro alle tue funzioni.
Michael Berkowski il

5
Se è qualcosa di importante, è possibile utilizzare anche una var di sessione.
Nikos Tsirakis,

Risposte:


259

L' $GLOBALSarray può essere utilizzato invece:

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

function body(){

    echo $GLOBALS['a'];
}

Dal manuale :

Un array associativo contenente riferimenti a tutte le variabili che sono attualmente definite nell'ambito globale dello script. I nomi delle variabili sono le chiavi dell'array.


Se si dispone di un set di funzioni che richiedono alcune variabili comuni, una classe con proprietà può essere una buona scelta anziché 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);

78

Se la variabile non cambierà, è possibile utilizzarla define

Esempio:

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

function footer()
{
    echo FOOTER_CONTENT;
}

2
Cosa succede quando FOOTER_CONTENTsi tenta di modificare? È proprio come finalin Java o constin C, C ++ e C #?
Leone,

4
Se provi a definire FOOTER_CONTENT una seconda volta, php lancerà un avviso al riguardo
Dale,

Avevo bisogno di calcolare il tempo di epoca unix corrente 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 che "echo FOOTER_CONTENT;" non avevo un precedente "$" e ho ricevuto degli errori.
user208145

Se la variabile non cambierà, non è una variabile. Non è vero ?!
Sajidur Rahman,

29

Aggiungi le tue variabili in $ GLOBALS come super array globale

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

e usarlo a livello globale

oppure puoi usare costanti accessibili in tutto lo script

define('HOSTNAME', 'localhost');  

1
Se usi 'define', una volta impostato, non puoi cambiare un define!
Reza MA,

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

no se vuoi usare questa variabile devi usarla come $ GLOBALS ['variabile'];
Pankaj Khairnar,

25

Se una variabile viene dichiarata al di fuori di una funzione, è già nell'ambito globale. Quindi non è necessario dichiarare. Ma da dove chiami questa variabile devi avere accesso a questa variabile. Se stai chiamando dall'interno di una funzione devi usare la globalparola chiave:

$variable = 5;

function name()
{
    global $variable;

    $value = $variable + 5;

    return $value;  

}

L'uso della parola chiave globale al di fuori di una funzione non è un errore. Se si desidera includere questo file all'interno di una funzione, è possibile dichiarare la variabile come global.

config.php

global $variable;

$variable = 5;

other.php

function name()
{
    require_once __DIR__ . '/config.php';
}

Puoi anche usare $GLOBALS. È un superglobal quindi ha accesso ovunque.

$GLOBALS['variable'] = 5;

function name()
{
    echo $GLOBALS['variable'];
}

A seconda della scelta è possibile scegliere uno dei due.


9

Questa risposta è molto tardi, ma quello che faccio è impostare una classe che contiene valori booleani, matrici e valori iniziali interi come variabili statiche di portata globale. Qualsiasi stringa costante viene 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

Le staticparole chiave devono essere presenti nella classe, altrimenti le variabili $ a, $ b e $ c non avranno un ambito globale.


Questa è una buona soluzione per molte ragioni. La classe static richiede solo pochi caratteri aggiunti al nome della variabile di base: G :: $ Name, dove la dichiarazione è simile alla seguente: class G {static $ Name, $ Name2;} Nota che G può essere veramente variabili globali, quindi E potrebbe essere utilizzato per le variabili relative ai dipendenti. Questo è più facile da programmare rispetto al paradigma full-oriented orientato agli oggetti supportato da PHP. Se le costanti sono veramente necessarie, puoi dichiararle dopo "const" proprio come le variabili dichiarate dopo "statico" - basta tralasciare i segni del dollaro. G :: Esempio sarebbe un esempio di una costante globale.
David Spector,

5

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 puoi usare. Puoi anche renderli variabili dichiarando le proprietà statiche alla classe, con funzioni per impostare la proprietà statica se vuoi cambiarla.


5

Puoi provare la parola chiave usenelle funzioni di chiusura o Lambdas se questo soddisfa le tue intenzioni ... PHP 7.0 però. Non è meglio, ma solo un'alternativa.

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

demo | Informazioni


1

Pensiamo un po 'diverso:

class globe{
    static $foo = "bar";
}

E puoi usarlo e modificarlo come preferisci, come:

function func(){
    echo globe::$foo;
}

0

Che cosa succede se si utilizza la funzione procedurale anziché la variabile e li si chiama in qualsiasi luogo come te.

Di solito faccio una raccolta di valori di configurazione e li inserisco in una funzione con dichiarazione di ritorno. Includo solo quello in cui ho bisogno di utilizzare il valore globale e chiamare una funzione particolare.

function host()
{
   return "localhost";
}

0

$GLOBALS[] è la soluzione giusta, ma dal momento che stiamo parlando di alternative, una funzione può anche fare facilmente questo lavoro:

function capital() {
    return my_var() . ' is the capital of Italy';
}

function my_var() {
    return 'Rome';
}

-19

Non dovresti più usare i globi, non sono disponibili in PHP 5.4.


19
REGISTER GLOBALS è stato rimosso. non globali.
Unity100

7
Questa risposta, come scritta, è sbagliata e dovrebbe essere aggiornata per riflettere il commento di unity100. Se i GLOBALS sono ancora disponibili, chiarire quali aspetti dei vari GLOBAL sono cambiati. Qualcosa come questo.
crashwap


@RobertColumbia Post molto interessante, e lo terrò a mente per altre risposte, ma non si applica in questo caso particolare. (Spero che tu stia usando quella meta per sottolineare come una risposta "non farlo" potrebbe essere valida e non come giustificazione che questa sia;)) " " Non farlo " può essere una risposta valida . "- 'può essere' non 'è'. " Ma a volte, invece, non è necessario fare nulla . Se semplicemente smetti di fare la cosa sbagliata, tutto ricomincerà magicamente a funzionare. " - Non si applica qui poiché il codice non è "rotto". L'OP vuole solo un modo "meno tipografico" di fare le cose. ...
robinCTS

" sta effettivamente cercando di rispondere alla domanda? Nella maggior parte dei casi, lo è. " - "La maggior parte", non "tutto". (Avrei persino contestato il "più", ma non ho visto abbastanza risposte del genere per fare una discussione informata). " In questo caso, non lo è. " - E in questa "risposta" non lo è anche, per le stesse ragioni: " Peggio ancora, la risposta di Murphy non propone una soluzione al problema " e " Non dà chi chiede uno strumento o un metodo o qualcosa che assomigli a una soluzione al suo problema ". ...
robinCTS
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.