00P-n00b: Globale Variablen

Beitrag lesen

jetzt bin ich zwar um ein paar Erkenntnise reicher aber scheinbar gibts da keine Wahrheit;?
Trotzdem Danke!

Es gibt Wahrheiten:

1. Vermeide globale Variablen unbedingt.
2. Konfigurationswerte müssen selten allen Komponenten komplett bekannt sein. Eine Datenbankkomponente braucht beispielsweise keine Infos für das Senden von Mails.
3. Konfigurationswerte sollten nicht vom Code änderbar sein.
4. Dependency Injection!

Aus diesen und weiteren Erkenntnissen folgt, dass die Konfiguration nicht ganz so simpel ist, aber letztendlich doch in erkennbare Phasen zerfällt.

1. Irgendwo sind die Werte persistiert. Das können Dinge wie eine INI-Datei, ein PHP-Code mit einem Array oder sowas sein.

2. Es gibt einen Mechanismus, an diese gesammelten Konfigurationswerte so heranzukommen, dass sie von Code genutzt werden können. Beispielsweise mit parse_ini_file(), require() oder etwas komplexerem (weil die Daten komplexer gespeichert sind).

3. Auf der anderen Seite gibt es ganz individuelle Stellen im Code, die genau einen (vielleicht abzählbar mehr als einen, aber definitiv niemals "alle") Werte aus der Konfiguration benötigen. Dieser Wert sollte dorthin von außen übergebbar sein, ohne dass man außen wissen muss, was intern damit passiert, und ohne dass man innen wegen irgendeiner globalen Variablenbezeichnung Angst haben muss, durch Veränderung etwas kaputt zu machen. Typische Umsetzungen wären die Übergabe als Parameter im Funktionsaufruf (ja, bei jedem Aufruf erneut), durch Aufrufen einer Konfigurationsfunktion für eine Gruppe von Funktionen (idealerweise ist das eine Klasse, die kann Werte intern versteckt ablegen), oder über den Konstruktor (für Konfigurationswerte, die dauerhaft gelten, ist das die einzig korrekte Möglichkeit).

4. Wie kommt jetzt der Konfigurationswert aus Punkt 2 an die Stelle, wo er gebraucht wird in Punkt 3: Die ideale Lösung ist hier noch nicht gefunden, es hängt davon ab, was man bereits einsetzt oder einzusetzen gewillt ist. Die klassische Lehre von Dependency Injection würde die Konfigurationswerte einfach als ebenfalls zu injectendes Element betrachten, d.h. beim Initialisieren des DI-Konstrukts würden alle Konfigurationswerte ebenfalls initialisiert, und durch den außerdem definierten Objektbaum verwendet. Man könnte die Konfiguration aber auch als Konstanten definieren und dort ansprechen, wo man die Objekte baut - nicht IN den Objekten (ein fester Konstantenname ist genauso eine globale Abhängigkeit, wie eine globale Variable), sondern in den Fabriken. In jedem Fall ist dieser Bereich nach meinem Gefühl noch etwas fummelig.