phpbar.de logo

Mailinglisten-Archive

[php] Globale Variablen

[php] Globale Variablen

Ulf Wendel UW_(at)_NetUSE.DE
Tue, 22 Feb 2000 11:03:53 +0100


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