Wie deklariere ich eine globale Variable in PHP?

168

Ich habe so einen Code:

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

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

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

Gibt es eine Möglichkeit, die globale Variable an einem Ort zu definieren und die Variable $ain allen Funktionen gleichzeitig zugänglich zu machen ? ohne mehr zu gebrauchen global $a;?

LICHT
quelle
15
Nein, gibt es nicht. Wenn Ihnen das globalSchlüsselwort nicht gefällt , sollten Sie das $GLOBALS['a']Superglobal in allen Bereichen verwenden oder den Parameter an Ihre Funktionen übergeben.
Michael Berkowski
5
Wenn es etwas Wichtiges ist, kann sogar eine Sitzungsvariable verwendet werden.
Nikos Tsirakis

Antworten:

259

Das $GLOBALSArray kann stattdessen verwendet werden:

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

function body(){

    echo $GLOBALS['a'];
}

Aus dem Handbuch :

Ein assoziatives Array, das Verweise auf alle Variablen enthält, die derzeit im globalen Bereich des Skripts definiert sind. Die Variablennamen sind die Schlüssel des Arrays.


Wenn Sie über eine Reihe von Funktionen verfügen, für die einige allgemeine Variablen erforderlich sind, ist eine Klasse mit Eigenschaften möglicherweise eine gute Wahl anstelle einer globalen:

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);
MrCode
quelle
78

Wenn sich die Variable nicht ändert, können Sie sie verwenden define

Beispiel:

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

function footer()
{
    echo FOOTER_CONTENT;
}
Tal
quelle
2
Was passiert, wenn FOOTER_CONTENTversucht wird, Änderungen vorzunehmen? Ist es wie finalin Java oder constin C, C ++ und C #?
Lion
4
Wenn Sie versuchen, FOOTER_CONTENT ein zweites Mal zu definieren, wird PHP einen Hinweis darauf werfen
Dale
Ich musste die aktuelle Unix-Epochenzeit jedes Mal berechnen, wenn eine Seite geladen wird, und diesen Wert dann in einigen Berechnungen (Funktionen) verwenden. "define" hat bei mir funktioniert. Anfangs habe ich das "echo FOOTER_CONTENT" nicht gesehen. hatte kein vorangestelltes '$' und ich habe Fehler bekommen.
user208145
Wenn sich die Variable nicht ändern wird, ist sie keine Variable. Ist es nicht?!
Sajidur Rahman
29

Fügen Sie Ihre Variablen in $ GLOBALS super global Array wie hinzu

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

und verwenden Sie es global

oder Sie können eine Konstante verwenden, auf die im gesamten Skript zugegriffen werden kann

define('HOSTNAME', 'localhost');  
Pankaj Khairnar
quelle
1
Wenn Sie 'define' verwenden, können Sie eine Definition nicht mehr ändern!
Reza MA
In Ihrem ersten Beispiel heißt es, dass die Variable '$ jetzt später im Skript' localhost 'heißt.
Zach Smith
nein, wenn Sie diese Variable verwenden möchten, müssen Sie sie wie $ GLOBALS ['variable'] verwenden;
Pankaj Khairnar
25

Wenn eine Variable außerhalb einer Funktion deklariert wird, befindet sie sich bereits im globalen Bereich. Es besteht also keine Notwendigkeit zu deklarieren. Aber von wo aus Sie diese Variable aufrufen, muss Zugriff auf diese Variable haben. Wenn Sie innerhalb einer Funktion aufrufen, müssen Sie das globalSchlüsselwort verwenden:

$variable = 5;

function name()
{
    global $variable;

    $value = $variable + 5;

    return $value;  

}

Die Verwendung eines globalen Schlüsselworts außerhalb einer Funktion ist kein Fehler. Wenn Sie diese Datei in eine Funktion aufnehmen möchten, können Sie die Variable als deklarieren global.

config.php

global $variable;

$variable = 5;

other.php

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

Sie können auch verwenden $GLOBALS. Es ist superglobal und hat überall Zugang.

$GLOBALS['variable'] = 5;

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

Abhängig von Ihrer Wahl können Sie entweder wählen.

Sajidur Rahman
quelle
9

Diese Antwort ist sehr spät, aber ich setze eine Klasse, die Boolesche Werte, Arrays und ganzzahlige Anfangswerte als statische Variablen für den globalen Bereich enthält. Alle konstanten Zeichenfolgen werden als solche definiert.

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

Die staticSchlüsselwörter müssen in der Klasse vorhanden sein, sonst werden die Variablen $ a, $ b und $ c nicht global erfasst.

Der einzige ChemistryBlob
quelle
Dies ist aus vielen Gründen eine gute Lösung. Für die statische Klasse sind nur wenige Zeichen erforderlich, die dem Namen der Basisvariablen hinzugefügt werden: G :: $ Name, wobei die Deklaration folgendermaßen aussieht: Klasse G {statischer $ Name, $ Name2;} Beachten Sie, dass G wirklich globale Variablen sein können, dann könnte E. für Variablen verwendet werden, die sich auf Mitarbeiter beziehen. Dies ist einfacher zu programmieren als das von PHP unterstützte objektorientierte Paradigma in vollem Umfang. Wenn Konstanten wirklich benötigt werden, können Sie sie nach "const" deklarieren, genau wie die nach "static" deklarierten Variablen - lassen Sie einfach die Dollarzeichen weg. G :: Beispiel wäre ein Beispiel für eine globale Konstante.
David Spector
5

Sie haben dies so beantwortet, wie Sie die Frage geschrieben haben - verwenden Sie 'define'. Einmal festgelegt, können Sie eine Definition nicht mehr ändern.

Alternativ gibt es Tricks mit einer Konstante in einer Klasse, z. B. class :: constant, die Sie verwenden können. Sie können sie auch variabel machen, indem Sie der Klasse statische Eigenschaften deklarieren. Mit Funktionen können Sie die statische Eigenschaft festlegen, wenn Sie sie ändern möchten.

Robbie
quelle
5

Sie können das Schlüsselwort usein Closure- Funktionen oder Lambdas ausprobieren, wenn dies Ihrer Absicht entspricht ... PHP 7.0. Nicht das ist besser, sondern nur eine Alternative.

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

Demo | die Info

Thielicious
quelle
1

Denken wir etwas anders:

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

Und Sie können es verwenden und ändern, wie Sie möchten:

function func(){
    echo globe::$foo;
}
Amir Fo
quelle
0

Was ist, wenn Sie die prozedurale Funktion anstelle der Variablen verwenden und sie an einer beliebigen Stelle aufrufen?

Normalerweise erstelle ich eine Sammlung von Konfigurationswerten und füge sie in eine Funktion mit return-Anweisung ein. Ich schließe nur das ein, wo ich den globalen Wert nutzen und eine bestimmte Funktion aufrufen muss.

function host()
{
   return "localhost";
}
Veshraj Joshi
quelle
0

$GLOBALS[] ist die richtige Lösung, aber da es sich um Alternativen handelt, kann eine Funktion diese Aufgabe auch problemlos erledigen:

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

function my_var() {
    return 'Rome';
}
Dario Ferrer
quelle
-19

Sie sollten keine Globals mehr verwenden, diese sind in PHP 5.4 nicht verfügbar.

Daniel West
quelle
19
GLOBALS REGISTRIEREN wird entfernt. keine Globalen.
Unity100
7
Diese Antwort ist wie geschrieben falsch und sollte aktualisiert werden, um den Kommentar von entity100 widerzuspiegeln. Wenn GLOBALS noch verfügbar sind, klären Sie bitte, welche Aspekte von GLOBAL vars geändert wurden. Etwas wie das.
Crashwap
@RobertColumbia Sehr interessanter Beitrag, und ich werde mich um andere Antworten kümmern, aber er gilt in diesem speziellen Fall nicht. (Ich hoffe , Sie nur , dass Meta mit darauf hinweisen , wie ein „tut das nicht“ Antwort könnte gültig sein und nicht als Begründung , dass dies ist;)) " ‚Tu das nicht‘ kann eine gültige Antwort sein . "-" kann "nicht" ist "sein. " Aber manchmal muss stattdessen nichts getan werden. Wenn Sie einfach aufhören, das Falsche zu tun, wird alles auf magische Weise wieder funktionieren. " - Gilt hier nicht, da der Code nicht "kaputt" ist. Das OP will nur eine "weniger tippende" Art, Dinge zu tun. …
robinCTS
" Versucht es tatsächlich, die Frage zu beantworten? In den meisten Fällen ist es das. " - "Die meisten", nicht "alle". (Ich würde sogar die "meisten" bestreiten, aber ich habe nicht genug solche Antworten gesehen, um ein fundiertes Argument zu liefern.) " In diesem Fall ist es nicht. " - Und in dieser "Antwort" ist es auch nicht aus den gleichen Gründen: " Schlimmer noch, Murphys Antwort schlägt keine Lösung für das Problem vor. " Und " Es gibt nicht der Fragesteller ein Werkzeug oder eine Methode oder irgendetwas, das einer Lösung seines Problems ähnelt ". …
robinCTS