global-Alternative

März 2024
Mitunter müssen Funktionen in tiefen Codestacks miteinander Daten austauschen können. Da bleibt es manchmal nicht aus, globale Variablen zu verwenden, die in Funktionen mit global gekennzeichnet sind oder über $GLOBALS['Variablenname'] zur Verfügung stehen.
Globale Variablen können jedoch zu Konflikten mit anderen Programmteilen führen und sollten vermieden werden.
Eine mögliche Lösung: Verwendung von static-Variablen, auch static-Funktionen, im Klassenzugriff.

Eine Klasse mit static-Komponenten

class myGlobalArea {

  public static $AY = array
  ( 'A' => 'a'
  , 'B' => 'b'
  );

  public static function showDate()
  {
    return date(DATE_RFC2822);
  }

} // end of class myGlobalArea
Mit static können einzelne Variablen, Arrays, Funktionen (bzw. Methoden) definiert werden.

Eine Funktion

function SetAValue($par = null)
{
  myGlobalArea::$AY['B'] = $par; 

  print  myGlobalArea::showDate().'<br>';
}
Die Funktion SetAValue() macht zwei Dinge, die nichts miteinander zu tun haben.
  • Sie verändert den Wert $AY['B'] in der Klasse myGlobalArea. Das geschieht über den sogenannten Klassenzugriff (im Bsp. myGlobalArea::) ohne dass ein Objekt dieser Klasse instantiiert werden muss.
  • Ebenfalls per Klassenzugriff wird die Methode showDate() aufgerufen und deren Rückgabe ausgegeben.

Anweisungen im Beispielprogramm

Die erste Anweisung gibt den Inhalt des Arrays einfach aus.
print '' .print_r(myGlobalArea::$AY, true).'';

// Ausgabe:
  Array
  (
      [A] => a
      [B] => b
  )
Die zweite Anweisung ist der Aufruf der Testfunktion. Die Ausgabe zeigt, dass der Aufruf der static-Funktion der Klasse funktioniert hat.
SetAValue('c');

// Ausgabe:
  Mon, 04 Mar 2024 11:13:38 +0100
Mit der dritten Anweisung wird das Array nochmal ausgegeben, und wir sehen, dass der Wert von $AY['B'] wirklich verändert wurde.
print '<pre>' .print_r(myGlobalArea::$AY, true).'</pre>';

// Ausgabe:
  Array
  (
      [A] => a
      [B] => c
  )

Zusammenfassung

Eine Klasse kann wie einen eigenen globalen Raum verwendet werden, da deren static-Komponenten überall per Klassenzugriff sichtbar sind. Der Code des PHP-Beispiels im Zusammenhang:
<?php
class myGlobalArea {

  public static $AY = array
  ( 'A' => 'a'
  , 'B' => 'b'
  );

  public static function showDate()
  {
    return date(DATE_RFC2822);
  }

}

function SetAValue($par = null)
{
  // Static Variable in einer Klasse verändern
  myGlobalArea::$AY['B'] = $par;

  print  myGlobalArea::showDate().'<br>';
}

print '<pre>' .print_r(myGlobalArea::$AY, true).'</pre>';

SetAValue('c');

print '<pre>' .print_r(myGlobalArea::$AY, true).'</pre>';
?>