Global ist eine Sünde

Aus php bar

Wechseln zu: Navigation, Suche

Viele Anfänger und alteingesessene Verfechter der prozeduralen Programmierung benutzen globale Variablen. Mit dem Schlüsselwort global ist es in PHP sehr einfach, Funktionen oder Methoden mit globalen Variablen zu versorgen. In der objektorientierten Programmierung sind Globale aber weitestgehendst verpönt, da diese im Code Abhängigkeiten erzeugen.

Inhaltsverzeichnis

Beispiel global

Häufig wird eine Datenbankklasse im globalen Kontext benutzt.

1 $GLOBALS['db'] = new DB();
2 function retrieve_users()
3 {
4   global $db;
5   return $db->getAll('SELECT * FROM users');
6 }


Fehleranfälligkeit

$GLOBALS ist ein besonderer Fall, da auf dieses Array aus jedem Kontext zugegriffen werden kann. Das bedeutet das man komfortabel auf Variablen zugreifen kann, aber auch das diese Überall verändert oder gar gelöscht werden können. Diese Tatsache führt zu schwierig auffindbaren Fehlern, da die Globalen nicht über die Parametriesierung der Funktionsaufrufe zurückverfolgt werden können.

Namensraum Kollisionen

Die Funktion im Beispiel ist auf eine Instanz der Datenbankklasse mit der Bezeichung 'db' im $GLOBALS Array angewiesen und kann nicht mehr ohne diese genutzt werden. Eine Abhängigkeit zu einer bestimmten Klasse oder Schnittstelle ist das kleinere Übel und besteht prinzipiell auch in objektorientierten Programmen. Viel größer werden die Probleme wenn diese Funktion mit einer anderen (externen) Funktion zusammenarbeiten soll die auch genau die gleiche Globale mit einem anderen Inhalt benutzt. In dem Fall wäre die einzige Lösung eine der Funktionen umzuschreiben.

Lösung: Singleton

Eine mögliche Lösung für das oben genannte Problem ist die Verwendung des Singleton patterns (dt. Schablone).

Hierbei wird durch Aufruf einer statischen Methode immer das selbe Objekt erhalten, welches dann verwendet werden kann.

Persönliche Werkzeuge