• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Problem mit Klasse

Gimli

Mitglied
Habe eine Klasse die CharacterDAO heißt:

PHP:
class CharacterDAO {
    private $dbObj;
    public $error;
    private $ini;
    
    public function __construct() {
        $db             = parse_ini_file("/config/db.ini");
        $this->ini         = parse_ini_file("/config/encarnium.ini");
        $this->dbObj = new MysqlDatabase($db);
        $this->dbObj->connect();
    }
    
    /**
    * Charakter in die Datenbank einfügen
    * @param array (Name, Class ID)
    * @return boolean
    */
    public function addcharacter($values) {

..................

    }
    /**
    * Destrukor
    */
    public function __destruct() {
        $this->dbObj->close();
    }
}

Problem liegt bei __destruct()

So nun wird dort die Methode close() aus der DB Klasse verwendet:

PHP:
public function close() {
    if($this->active === "connect") {
      Logger::debug("Verbindung zur Datenbank '".$this->db."' unterbrochen \r\n", "db");
      mysql_close($this->dbObj);  
    }    
  }

Dort wird die Methode debug aus der Statischen Klasse Debug aufgerufen.

Nun kommt aber Logger.ini konnte nicht gefunden werden. Wenn ich die funktion close() irgendwo anders als im Destruktor aufrufe funktioniert es. Woran liegt das?

mfg Mark
 
PHP:
<?php

class Test
{
    public function cwd()
    {
        echo 'test: "' . getcwd() . '"' . "\n";
    }

    /**
     * Destrukor
     */
    public function __destruct() {
        echo '__destruct: "' . getcwd() . '"' . "\n";
    }
}

$t = new Test();
$t->cwd();

Ich bekomme die Ausgabe:

Code:
test: "/home/marc/w/nb/sandbox/gimli"
__destruct: "/"

Ich weiß nicht genau, wie das unter Windows mit den (absoluten?) Pfaden aussieht. Die wahrscheinliche Ursache für das Problem ist jedoch, dass du versuchst, die logger.ini über einen relativen Pfad zu laden, sich die Programmausführung aber im Destruktor nicht mehr in dem Verzeichnis (".") befindet, in dem du sie vermutest.

Eine Lösung wäre es, vor dem Destruktor in der Logger-Klasse den korrekten Gesamtpfad zu ermitteln, zwischenzuspeichern und die *.ini-Datei immer über diesen zu laden.

Zum Beispiel so:

PHP:
<?php

class Logger
{
    protected static $_path = '';

    public static function init($path)
    {
        self::$_path = realpath($path);
    }

    public static function log()
    {
        echo 'Schreibe nach Pfad: ' . self::$_path . "\n";
    }
}

class Test
{
    public function cwd()
    {
        Logger::log('cwd');
    }

    /**
     * Destrukor
     */
    public function __destruct() {
        Logger::log('__destruct');
    }
}

// Wichtig: Datei muss existieren
Logger::init('./config/logger.ini');

$t = new Test();
$t->cwd();
 
Logger-Konfiguration konnte nicht geladen werden: C:\xampp\htdocs\encarnium\trunk\configlogger.ini

irgendwie fügt der kein Slashnach config hinzu. hab folgendes durch realpath gejagt: "config/"

edit: QUARK! Natürlich folgendes: "config/logger.ini"

Edit2: Geht immer noch nicht
 
Einfache Lösung: self::$_path = realpath($path) . DIRECTORY_SEPARATOR;

Aber schöner ist es, wenn du Pfade generell als "ohne beendenden Slash/Backslash" begreifst und beim Hinzufügen von Dateinamen immer einen hinzusetzt. $path .= '/config.ini';

So gehst du auf Nummer sicher. Treffen zwei Slashes aufeinander, werden sie als einer interpretiert. Ich denke, auch unter Windows würde sowas wie "c:\/config.ini" korrekt als "c:\config.ini" interpretiert. Probiere ich gleich auch mal aus.

Edit: Ja, sollte hinhauen.
 
Zuletzt bearbeitet:
Zurück
Oben