Ein wichtiges Thema im Zusammenhang mit Variablen ist deren Gültigkeitsbereich und Sichtbarkeit. Generell gilt, dass in PHP Variablen immer nur in ihrem lokalen Kontext sichtbar sind.
Dieser beinhaltet auch den Bereich für Dateien, die per include- oder require-Anweisung eingebunden wurden, z. B.:
$autor = "Matthias";
include "buch.inc.php";
Die Variable $autor ist auch in der eingebundenen Datei buch.inc.php verfügbar. Eine innerhalb einer Funktion definierte Variable ist außerhalb der Funktion nicht sichtbar. Umgekehrt gilt dasselbe, d. h., eine außerhalb sämtlicher Funktionsblöcke global definierte Variable hat innerhalb eines Funktionsblocks keine Gültigkeit.
Beispiel
<?php
// Globaler Bereich
$preis = 9.99;
function berechne() {
// Referenz auf einen lokalen Bereich
return $preis;
}
$betrag = berechne();
if ($betrag) {
echo $betrag;
} else {
echo "Keine Ausgabe, die Variable ist lokal nicht sichtbar!";
}
?>
Ausgabe
Keine Ausgabe, die Variable ist lokal nicht sichtbar!
Um zu erreichen, dass die globale Variable $preis auch lokal innerhalb der Funktion berechne bekannt ist, muss diese explizit mithilfe des Schlüsselworts global innerhalb der Funktion bekannt gemacht werden, man lädt sie sozusagen ein.
Beispiel
<?php
$preis = 9.99;
function berechne() {
global $preis;
return $preis;
}
$betrag = berechne();
if ($betrag) {
echo $betrag;
} else {
echo "Keine Ausgabe, die Variable ist lokal nicht sichtbar!";
}
?>
Ausgabe
9.99
Hinweis: Auf den Einsatz und die Verwendung von Funktionen wird im Abschnitt 3.8 »Funktionen und Prozeduren eingegangen«.
Zugriff über $GLOBALS
Eine andere Möglichkeit, im lokalen Kontext einer Funktion auf eine globale Variable zuzugreifen, steht über das von PHP definierte Array $GLOBALS zur Verfügung.
Hierbei handelt es sich um ein assoziatives Array, das die Namen der globalen Variablen als Schlüsselwörter verwendet. Den Zugriff innerhalb des lokalen Kontextes einer Funktion über das Array $GLOBALS auf die lokale Variable $preis zeigt folgendes Beispiel:
<?php
$preis = 9.99;
function berechne() {
return $GLOBALS[preis];
}
echo berechne();
?>
Ausgabe
9.99
Speicherklassen von Variablen
Eine weitere wichtige Eigenschaft von Variablen ist deren Speicherklasse. Normale Variablen verlieren beim Verlassen des lokalen Kontextes ihren Wert und werden beim Wiedereintritt neu initialisiert.
Sollen Variablen auch nach dem Verlassen eines Funktionsblocks ihren Wert behalten, müssen sie mithilfe des Schlüsselworts static als statische Variablen deklariert werden.
Im folgenden Beispiel hat die Variable $zaehler keine statische Lebensdauer, sie wird bei jedem Neueintritt in den Funktionsblock erneut initialisiert. Das Ergebnis der Ausgabe bleibt trotz zweimaligen Aufrufs der Funktion setzeZaehler() 1.
<?php
function setzeZaehler() {
$zaehler = 0;
$zaehler++;
return $zaehler;
}
$zustand1 = setzeZaehler();
// Ausgabe (1)
echo $zustand1;
$zustand2 = setzeZaehler();
// Ausgabe (1)
echo $zustand2;
?>
Wird die Variable $zaehler jedoch als statisch erklärt, behält sie auch nach dem Verlassen des Funktionsblocks und dem Wiedereintritt bei einem erneuten Aufruf der Funktion setzeZaehler() ihren Wert, sodass sich, wie das folgende Beispiel zeigt, ein anderes Ergebnis einstellt:
<?php
function setzeZaehler() {
static $zaehler = 0;
$zaehler++;
return $zaehler;
}
$zustand1 = setzeZaehler();
// Ausgabe (1)
echo $zustand1;
$zustand2 = setzeZaehler();
// Ausgabe (2)
echo $zustand2;
?>
Eine weitere interessante Anwendung in diesem Zusammenhang sind rekursive Funktionen. Dies sind Funktionen, die sich aus sich selbst heraus aufrufen. Hierbei besteht die Gefahr, sogenannte Endlosschleifen bzw. Endlosrekursionen zu programmieren, welche die Performance des jeweiligen Systems äußerst negativ beeinflussen. Sie müssen also einen Weg vorsehen, diese Rekursion zu beenden. Die folgende Funktion setzeZaehler() zählt rekursiv bis 10. Die statische Variable $zaehler wird benutzt, um die Rekursion zu beenden:
<?php
function setzeZaehler() {
static $zaehler = 0;
$zaehler++;
echo $zaehler;
if ($zaehler < 10) {
setzeZaehler();
}
}
// Ausgabe (12345678910)
setzeZaehler();
?>
Achtung: Sollten Sie keine statische Variable verwenden, kommt es zu einer Endlosschleife.
|