Mailinglisten-Archive |
Roland Sippel wrote: > > Wie kann man Globale Variablen definieren und vorbelegen > damit sie in allen Blöcken zur Verfügung stehen. Ich wollte > mir bei ca. 100 Variablen ersparen die in jeden Block neu > als global zu definieren. > > Folgende IDEE geht irgend wie NICHT: > > $meineVar = "hallo text"; > > function initvar($varname) > { > global $$varname; > if(!isset($$varname)) > $$varname=''; Encapsulation zu brechen sollte wohlüberlegt sein und nicht ohne Grund erfolgen. Ich habe es gestern benötigt, weil die Methode ein Formular per include() einbindet und dieses je nach Formular (lesenden) Zugriff auf unterschiedliche globale Variablen benötigt. Die Methode selbst läßt die Finger von importieren Variablen. Alle lokalen Variablen beginnen zur Vorbeugung von Kollisionen mit einem Unterstrich. Ich versuche dadurch die Menge des verwirrenden und schwer zu debuggenden Code so gering wie möglich zu halten (was nicht gelang...). Die riesige Anzahl von Variablen, die Du importieren möchtest ist außergrwöhnlich groß. Eigentlich sollte man globale Daten als Parameter an die Funktion übergeben, lokal verarbeiten und mit einem return zurückliefern. Ist die Anzahl der Parameter sehr groß, sollte man überlegen ob Arrays sinnvoll eingesetzt werden können. Das gilt allgemein. Wer diese Regel verfolgt, wird bis auf wenige Ausnahmen nie global benötigen. global ist so verschriehen, weil Funktionen/Methoden im Idealfall black boxes sind, die als kleine Helferlein den "main" Code nicht beeinflussen. Code wird in einer Funktion eingesperrt und erfüllt eine bestimmte Aufgabe. Wie diese Aufgabe gelöst wird, ist schnuppe. Wichtig ist, daß die Funktion die Aufgabe löst und stets die gleichen Schnittstellen zur Verfügung stellt. Solch eine Funktion kann unviversell ohne Nebenwirkungen eingesetzt werden. Stellt die Funktion Anforderunen an globale Variablen, ist die Verwendung eingeschränkt. Manipuliert sie diese gar, was untypisch ist, rennt man in Fehler, die man schwer findet, weil eigentlich ist das ja eine ungefährliche black box... Der Ansatz: Prinzipiell kann man entweder global benutzen oder der Funktion Referenzen übergeben. Letzteres würde mir gut gefallen, doch da PHP3 Funktionen keine variable Parameteranzahl verarbeiten können (PHP4 kann es), ist es nicht möglich diesen Weg zu verfolgen. Ein dreckiger Hack, der nicht ohne deutliche, warnende Kommentarzeilen in meinen Code wanderte ist: function foo($vars) { // Import if (!is_array($vars)) $vars = array ( $vars ); reset($vars); while (list(, $varname)=each($vars)) $$varname = $GLOBALS[$vars]; [...] // Export reset($vars); while (list(, $varname)=each($vars)) $GLOBALS[$vars] = $$varname; } Ulf -- Ulf Wendel NetUSE Kommunikationstechnologie GmbH Siemenswall, D-24107 Kiel, Germany Fon: +49 431 386435 00 -- Fax: +49 431 386435 99
php::bar PHP Wiki - Listenarchive