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?
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).
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‘);
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.