Superglobale Variablen

Neben globalen Variablen kennt PHP auch noch die sogenannten superglobalen Variablen. Diese sind auch ohne explizite global-Deklaration in jedem Gültigkeitsbereich automatisch verfügbar:

<?php declare(strict_types=1);

some_function();

function some_function(): void
{
    var_dump($_GET);
    var_dump($_POST);
}
superglobalVariables.php
superglobalVariables.php:7:
array(0) {
}
superglobalVariables.php:8:
array(0) {
}
Ausgabe von superglobalVariables.php
superglobalVariables.php ausführen

Es gibt noch mehr superglobale Variablen, die im PHP-Handbuch aufgelistet sind.

Historisch bedingt gibt es in PHP auch noch das superglobale assoziative Array $GLOBALS, über das wir alternativ auf globale Variablen zugreifen können:

<?php declare(strict_types=1);

$a = 'test';
$GLOBALS['a'] = 'test!';
var_dump($a);
writingGlobal.php
writingGlobal.php:5:
string(5) "test!"
Ausgabe von writingGlobal.php
writingGlobal.php ausführen

Seit der Version PHP 8.1 ist ein schreibender Zugriff nur noch auf einzelne globale Variablen möglich. Jeder Versuch, schreibend auf das gesamte $GLOBALS zuzugreifen, führt seit PHP 8.1 direkt zu einem Übersetzungsfehler:

<?php declare(strict_types=1);

var_dump($GLOBALS);
$GLOBALS = [];
var_dump($GLOBALS);
writingGlobals-will-fail.php
PHP Fatal error:  $GLOBALS can only be modified using the $GLOBALS[$name] = $value syntax in writingGlobals-will-fail.php on line 4
Ausgabe von writingGlobals-will-fail.php
writingGlobals-will-fail.php ausführen

Wir sehen, dass noch nicht einmal der erste var_dump() ausgeführt wurde. Die Programmausführung wurde gar nicht erst begonnen, weil uns der Compiler direkt abgesägt hat.

Wenn Du schon globale Variablen verwendest, dann deklariere sie mit global und verwende nicht $GLOBALS.

Fragen zur Lernkontrolle

  1. Der Zugriff auf Daten eines HTTP-Requests ist dank superglobaler Variablen sehr komfortabel. Welche Nachteile hat das?
  2. "Nach dem Update auf PHP 8.1 ist kein Zugriff mehr auf globale Variablen möglich". Kommentiere diese Aussage.
  3. Formuliere sinnvolle Regeln für Deine Coding Guidelines, wie globale Variablen verwendet werden sollen bzw. dürfen.