echo $begrüßung;
Das Problem: Beim Aufruf bekomme ich folgende Fehlermeldung zurück:
Fatal error: Using $this when not in object context in C:\Programme\xampp\htdocs\game\sitefiles\siteclasses\db.gameclass.php on line 33
Der Aufruf erfolgt also in dieser Form:
$carls_db_connection = Database::get_conn();
Wenn du eine Methode einer Klasse statisch aufrufst, dann existiert keine Instanz, die mit $this angesprochen werden kann. Alle Bezüge auf Methoden der Klasse innerhalb dieser statischen Methode müssen ebenfalls statisch notiert werden. Statt
$conn = $this->db_connect();
notierst du
$conn = Database::db_connect();
oder mehr PHP-5-like:
$conn = self::db_connect();
Zusatz-Information:
Wenn man aus einem statischen Methodenaufruf auf Eigenschaften der Klasse zugreifen will, können das nur statische Eigenschaften sein. Siehe Kapitel Static Keyword.
Ein Verbesserungsvorschlag:
Da du mit PHP5 arbeitest (mysqli gibt es ja unter PHP4 nicht) kannst du das eleganter lösen. Die lokale statische Variable $conn brauchst du nicht, denn es gibt statische Klassenvariablen. Du kannst eigentlich auch die Methode ganz einsparen.
class Database {
private static $db = false;
public static function db_connect() {
if (!self::$db) {
@self::$db = new MySQLi($DBCONFIG['host'], $DBCONFIG['user'], $DBCONFIG['pass'], $DBCONFIG['db_name']);
if (mysqli_connect_errno()) {
self::$db == false;
throw new Exception(mysqli_connect_error());
}
return self::$db;
}
}
...
try {
$carls_db_connection = Database::db_connect();
...
} catch (Exception $ex) {
echo 'Fehler: ', $ex->getMessage();
}
Es ist nicht Aufgabe der db_connect-Methode eine Fehlermeldung auszugeben, da diese Methode nicht weiß, in welchem Kontext sie aufgerufen wurde, und ob dort die Ausgabe einer Fehlermeldung erwünscht ist. Deswegen lasse ich den Fehlerzustand durch das Auslösen einer Exception signalisieren. Die Exception wird dann vom aufrufenden Teil behandelt. Hier kann sie ausgegeben werden, ins Logfile geschreiben werden, usw.
Beachte auch die Deklaration von $db mit vorangehendem "private". Damit wird ein Direktzugriff verhindert. Dieser ist unerwünscht, weil dabei nicht garantiert werden kann, dass sich darin ein gültiges mysqli-Objekt befindet.
echo "$verabschiedung $name";