Günther S: PHP OOP Variablengültigkeit

Hallo zusammen,

ich experimentiere gerade ein bisschen mit OOP in PHP rum und bin auf folgendes Problem gestoßen:

  
  
// VORHER (funktioniert):  
  
// index.php  
/* Einbindung von Einstellungen, Konstantendeklarationen, ... */  
  
$test = array(1, 2, 3);  
include(EXTENSIONS_DIR . "test.ext.php");  
  
// test.ext.php  
  
print_r($test); // liefert erwünschtes Ergebnis Array(1, 2, 3)  
  
// NACHHER (funktioniert noch nicht):  
  
  
// index.php  
/* Einbindung von Einstellungen, Konstantendeklarationen, ... */  
include(CLASSES_DIR . "core.class.php");  
  
$test = array(1, 2, 3);  
Core::loadExtension("test.ext.php");  
  
// core.class.php  
  
class Core  
{  
    function loadExtension($name)  
    {  
        include(EXTENSIONS_DIR . $name);  
    }  
}  
  
// test.ext.php  
  
print_r($test);  
// liefert Fehlermeldung:  
//Notice: Undefined variable: test in [...]test.ext.php on line 2  
  

Die Pfade stimmen alle (alle Dateien werden eingebunden, auch core.class.php). Meine Frage ist nun, wieso die Variablen in test.ext.php nicht mehr verfügbar sind bzw. ob man das umgehen kann, ohne "global $test;" zu verwenden (ich habe da noch eine menge weiterer variablen, die möchte ich nicht alle einzeln global verfügbar machen müssen.

Gruß,
Günther

  1. class Core
    {
        function loadExtension($name)
        {
            include(EXTENSIONS_DIR . $name);
        }
    }

    // test.ext.php

    print_r($test);

    Hi Günther,

    Ein include/require lädt den Code in der angeforderten Datei dorthin, wo der include/require aufgerufen wird und das ist in deinem Fall die function loadExtension.

    D.h. deine Variable $test ist nur innerhalb dieser Funktion verfügbar, sobald du die Funktion verlässt ist es vorbei, es sei denn du würdest die Variable mit global $test = array(1,2,3) definieren.

    Hoffe das hilft dir weiter.
    P.S.: Wenn es für dein Script wichtig ist, daß diese Extension geladen wird dann verwende require(), das bricht das Script ab wenn die Datei nicht gefunden/geladen werden kann.

    Michael H.

    1. Hallo Michael,

      Ein include/require lädt den Code in der angeforderten Datei dorthin, wo der include/require aufgerufen wird und das ist in deinem Fall die function loadExtension.

      Stimmt, das leuchtet ein.
      Und eine Möglichkeit, eine Methode zu veranlassen, etwas in das ursprüngliche Script einzubinden, gibt es nicht, oder?

      Bsp. zur Veranschaulichung:

        
      // index.php  
        
      Core::loadExtension('test');  
        
      // loadextension.class.php  
        
      class Core  
      {  
          function loadExtension($name)  
          {  
              // an dieser Stelle soll $name in index.php eingebunden werden. Ist das möglich?  
          }  
      }  
        
      
      

      Gruß,
      Günther

      1. Hallo Günther,

        Ich sehe keine Möglichkeit so etwas zu tun, außer eben die Variablen in der ausgelagerten Datei immer mit global zu definieren.

        Sorry,
          Michael

      2. echo $begrüßung;

        Und eine Möglichkeit, eine Methode zu veranlassen, etwas in das ursprüngliche Script einzubinden, gibt es nicht, oder?

        Globale Variablen sind sowieso nicht das Wahre bei OOP. Nicht veränderliche Werte können in Konstanten definiert werden, die sind überall verfügbar. Ansonsten wäre das Registry-Muster eine brauchbare Alternative, Objekte zwischenzuspeichern, die von mehreren Programmteilen verwendet werden sollen. Durch die Registry liegen sie verfügbar an einem definierten Ort und müssen nicht überall durchgereicht oder gar mit global angesprochen werden.

        Eine Registry ist ein Objekt, dass auf Anforderung hin ein anderes Objekt unter einem bestimmten Namen speichert und ebenfalls auf eine Anforderung dieses benannte Objekt wieder hergibt. Und so sieht die Anwendung der Registry aus:

        // Einstellen
          Registry::register('name', $object);

        // Abholen
          $object = Registry::get('name');

        Gegebenenfalls muss man das Abholen noch in einen try-catch-Block stecken, wenn nicht sichergestellt ist, dass das Objekt garantiert existiert.

        Um die Objekte innerhalb der Registry zu speichern, eignet sich eine statische Klassen-Eigenschaft in der Registry-Klasse.

        echo "$verabschiedung $name";