Problem mit Klasse

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();
}

}

[/PHP]

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);
}
}

[/PHP]

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

Schuss ins Blaue:

Note: Destructors called during the script shutdown have HTTP headers already sent. The working directory in the script shutdown phase can be different with some SAPIs (e.g. Apache).

(PHP: Constructors and Destructors - Manual)

Lass dir mal testweise getcwd während der normalen Laufzeit und dann im Destruktor ausgeben. Sind die Werte identisch?

„Nichts“ in einer methode
C:\xampp im destruktor

[php]<?php

class Test
{
public function cwd()
{
echo ‚test: "‘ . getcwd() . ‚"‘ . „\n“;
}

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

}

$t = new Test();
$t->cwd();[/php]

Ich bekomme die Ausgabe:

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();[/php]

[B]Logger-Konfiguration konnte nicht geladen werden: C:\xampp\htdocs\encarnium\trunk\configlogger.ini

[/B]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.

danke, funktioniert