Suche…


Einführung

Der Gültigkeitsbereich von Variablen bezieht sich auf die Codebereiche, auf die auf eine Variable zugegriffen werden kann. Dies wird auch als Sichtbarkeit bezeichnet . In PHP-Gültigkeitsbereichen werden Blöcke durch Funktionen, Klassen und einen globalen Gültigkeitsbereich definiert, der in einer Anwendung verfügbar ist.

Benutzerdefinierte globale Variablen

Der Gültigkeitsbereich außerhalb einer Funktion oder Klasse ist der globale Gültigkeitsbereich. Wenn ein PHP-Skript ein anderes enthält ( include oder require ), bleibt der Gültigkeitsbereich unverändert. Wenn ein Skript außerhalb einer Funktion oder Klasse enthalten ist, befinden sich seine globalen Variablen im selben globalen Gültigkeitsbereich. Wenn jedoch ein Skript innerhalb einer Funktion enthalten ist, befinden sich die Variablen im eingebundenen Skript im Funktionsumfang.

Im Rahmen einer Funktions- oder Klassenmethode kann das global Schlüsselwort zum Erstellen von benutzerdefinierten globalen Variablen mit Zugriff verwendet werden.

<?php

$amount_of_log_calls = 0;

function log_message($message) {
    // Accessing global variable from function scope
    // requires this explicit statement
    global $amount_of_log_calls;

    // This change to the global variable is permanent
    $amount_of_log_calls += 1;

    echo $message;
}

// When in the global scope, regular global variables can be used
// without explicitly stating 'global $variable;'
echo $amount_of_log_calls; // 0

log_message("First log message!");
echo $amount_of_log_calls; // 1

log_message("Second log message!");
echo $amount_of_log_calls; // 2

Eine zweite Möglichkeit, auf Variablen aus dem globalen Bereich zuzugreifen, ist die Verwendung des speziellen, von PHP definierten, $ GLOBALS-Arrays.

Das $ GLOBALS-Array ist ein assoziatives Array, wobei der Name der globalen Variablen der Schlüssel und der Inhalt dieser Variablen der Wert des Array-Elements ist. Beachten Sie, wie $ GLOBALS in jedem Bereich existiert, denn $ GLOBALS ist ein Superglobal.

Dies bedeutet, dass die Funktion log_message() folgendermaßen umgeschrieben werden kann:

function log_message($message) {
    // Access the global $amount_of_log_calls variable via the
    // $GLOBALS array. No need for 'global $GLOBALS;', since it
    // is a superglobal variable.
    $GLOBALS['amount_of_log_calls'] += 1;

    echo $messsage;
}

Man könnte fragen, warum das Array $ GLOBALS verwendet wird, wenn das global Schlüsselwort auch verwendet werden kann, um den Wert einer globalen Variablen abzurufen? Der Hauptgrund ist, dass die Verwendung des global Schlüsselworts die Variable in den Geltungsbereich bringt. Sie können dann denselben Variablennamen nicht im lokalen Bereich wiederverwenden.

Superglobale Variablen

Superglobal-Variablen werden von PHP definiert und können ohne das global Schlüsselwort immer und überall verwendet werden.

<?php

function getPostValue($key, $default = NULL) {
    // $_POST is a superglobal and can be used without
    // having to specify 'global $_POST;'
    if (isset($_POST[$key])) {
        return $_POST[$key];
    }

    return $default;
}

// retrieves $_POST['username']
echo getPostValue('username');

// retrieves $_POST['email'] and defaults to empty string
echo getPostValue('email', '');

Statische Eigenschaften und Variablen

Statische Klasseneigenschaften, die mit der public Sichtbarkeit definiert werden, sind funktional identisch mit globalen Variablen. Auf sie kann von überall her zugegriffen werden, wo die Klasse definiert ist.

class SomeClass {
    public static int $counter = 0;
}

// The static $counter variable can be read/written from anywhere
// and doesn't require an instantiation of the class
SomeClass::$counter += 1;

Funktionen können auch statische Variablen innerhalb ihres eigenen Bereichs definieren. Diese statischen Variablen bleiben im Gegensatz zu regulären Variablen, die in einem Funktionsbereich definiert sind, durch mehrere Funktionsaufrufe erhalten. Dies ist eine sehr einfache und einfache Möglichkeit, das Singleton-Entwurfsmuster zu implementieren:

class Singleton {
    public static function getInstance() {
        // Static variable $instance is not deleted when the function ends
        static $instance;

        // Second call to this function will not get into the if-statement,
        // Because an instance of Singleton is now stored in the $instance
        // variable and is persisted through multiple calls
        if (!$instance) {
            // First call to this function will reach this line,
            // because the $instance has only been declared, not initialized
            $instance = new Singleton();
        }

        return $instance;

    }
}

$instance1 = Singleton::getInstance();
$instance2 = Singleton::getInstance();

// Comparing objects with the '===' operator checks whether they are
// the same instance. Will print 'true', because the static $instance
// variable in the getInstance() method is persisted through multiple calls
var_dump($instance1 === $instance2);


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow