Globale Variable in Funktion - Problem

paulee

Erfahrenes Mitglied
Hallo!

Ich benutze folgende Funktion in einer Webapplikation. Mit Hilfe dieser Funktion hole ich mir bestimmte Voreinstellungen aus einer DB-Tabelle. Wie man sehen kann, alde ich eine globale Variable namens "dba".

PHP:
    function __o($option) {
        global $dba;
       
       
        $option = strtoupper($option);
        $d = $dba->get("SELECT o_value FROM options WHERE o_option='{$option}'");
       
        return $d['o_value'];
    }


$dba wird in der index.php wie folgt definiert:

PHP:
        $dba = new db("mysql:host".DB_HOST.";port=".DB_PORT.";dbname=".DB_NAME,DB_USER,DB_PASS);


Bis jetzt hat der Funktionsaufruf eigentlich immer geklappt. Heute habe ich allerdings eine Datei aufgerufen, in der ich auch die obige Funktion aufgerufen habe.:

PHP:
  if(strlen($_POST['bill_reverse_cause'])<__o("MIN_LENGTH_REVERSEBILL")) {
     $err++;
   }

Nachdem ich die Datei ausgeführt habe, kam folgender Fehler:

Code:
Fatal error: Call to a member function get() on a non-object in /var/www/osm/functions/common.php on line 212

Erste Frage: Kann mir jemand erklären warum $dba in dieser Funktion auf einmal nicht mehr funktioniert? $dba ist als global in X anderen Funktionen in der Applikation definiert - funktioniert aber überall probemlos. Nur in dieser einen Funktionen habe ich auf einmal Probleme mit dem laden von $dba.


NAchdem ich __o() wie folgt umgeschrieben habe, funktionierte der Aufruf wieder, bis ....
PHP:
    function __o($option) {
        $dba = new db("mysql:host".DB_HOST.";port=".DB_PORT.";dbname=".DB_NAME,DB_USER,DB_PASS);
       
        $option = strtoupper($option);
        $d = $dba->get("SELECT o_value FROM options WHERE o_option='{$option}'");
       
        return $d['o_value'];
    }


...ich dann folgende Funktion wieder aufrufen wollte:
PHP:
  if(strlen($_POST['bill_reverse_cause'])<__o("MIN_LENGTH_REVERSEBILL")) {
     $err++;
   }


Dann zeigte mir mein Browser auf einmal an, dass die geforderte Seite nicht mehr verfügbar war. Auf meinem Server (debian,64bit, inkl. aller aktuellen Updates) sah ich unter /var/log/apache2/error.log nach, was da los war. Folgende Zeile stand da:

Code:
[Sun Nov 23 16:31:11 2014] [notice] child pid 2492 exit signal Segmentation fault (11)


...sprich die Engine stürzte ab. Kann mir jemand sagen was ich falsch mache? :( Bin ratlos!!
 
Hallo,

$dba ist zum Zeitpunkt des Aufrufs der Funktion kein Objekt. Erstellst du wirklich das globale Objekt, bevor du die Funktion aufrufst?

Du solltest übrigens Abstand von globale Variablen halten, v. a. in deinem Fall!
 
Ich erstelle das Objekt davor ja.
Was würdest du mir in meinem Fall empfehlen?
In jeder Funktion die Klasse so starten? Ist das das nicht inperformanter?

PHP:
$dba = new db("mysql:host".DB_HOST.";port=".DB_PORT.";dbname=".DB_NAME,DB_USER,DB_PASS);
 
Dann prüfe, was in der Variable enthalten ist, per Debugger oder var_dump().

Ich würde dir "Dependency Injection" empfehlen. Google mal nach dem Begriff. Es geht darum, die Abhängigkeit (bei dir die DB-Instanz) an die Funktionen oder Objekte per Aufruf bzw. Konstruktor/Methoden zu übergeben. Das erleichert auch Unit Testing.

Ich weiß nicht, wie weit dein Projekt schon fortgeschritten ist. Du müsstest eventuell vieles umschreiben.
 
Zurück