PHP Statische oder normales Datenbankobject

Guten Morgen zusammen,

ich beiße mir seit gestern nun an folgender Situation die Zähne aus:
Ich baue mir anhand eines Tutorials ein MVC-Framwork auf, welches ich für meine Homepage benutzen möchte.

Bisher klappt alles auch schön und gut, jedoch habe ich ein Problem bei der Datenabfrage über eine Datenbankklasse aus dem Model heraus.

Das DB-Object instanziiere ich als normale Variable im __Contruct, damit dies zur Lebenzeit des Objects (Model) zur Verfügung steht und ich mir die Daten aus der DB holen kann.

Jedoch wirft er mir in Zeile 23 einen Fehler den ich garnicht nachvollziehen kann:

Code:
Fatal error: Using $this when not in object context in C:\xampp\htdocs\disane\classes\model.php on line 23


PHP:
<?php
/**
 * Dataaccess-Layer
 * Author: Marco Franke
 * Date: 21:20 22.12.2009
 */

require_once("config/settings.php");
require_once("classes/database.php");

class Model{
    private $mysql;
    private static $NewsArticles = array();
    
    public function __contruct(){
    
        $this->mysql = new Database(DBHOST, DBPW, DBUSER, DBNAME);
    }

    /**
     * Gibt alle Einträge des Blogs zurück.
     */
    public static function getNewsArticles(){
// Hier tritt der Fehler auf:
        self::$NewsArticles[] = mysql_fetch_assoc($this->mysql->receiveData("SELECT ID, Headline, Article, DateTime, FK_User_ID FROM NewsArticles"));
        return self::$NewsArticles;
    }

    /**
     * Gibt einen bestimmten Eintrag zurück.
     */
    public static function getNewsArticle($id){
        if(array_key_exists($id, self::$NewsArticles)){
            return self::$NewsArticles[$id];
        }else{
            return null;
        }
    }
}
?>

Auch wenn ich das DB-Object als static deklariere und damit aufrufen will, sagt er mir dass ich auf kein Object zugreifen kann.

Meine "Recherchen" ergaben, dass aber das DB-Object NULL ist.
Das Datenbankobject funktioniert aber (wenn ich es nicht aus dem Model aufrufe, sondern z.b. in der index.php) ganz normal und wie gewohnt.

Eventuell sieht einer von euch den Fehler sofort und könnte mich da unterstützen.

Vielen Dank!

EDIT:
So klappt es nun.
Wie ich erfahren habe, muss ich das Singleton(-Verfahren) dort benutzen.
So klappt es:

PHP:
<?php
/**
 * Dataaccess-Layer
 * Author: Marco Franke
 * Date: 21:20 22.12.2009
 */

require_once("config/settings.php");
require_once("classes/database.php");

class Model{

	private static $mysql = false;
	private static $NewsArticles = array();
	
	public static function getInstance() {
		if(self::$mysql === false) {
			self::$mysql = new Database(DBHOST, DBPW, DBUSER, DBNAME);
		}
		return self::$mysql;
	} 

	/**
	 * Gibt alle Einträge des Blogs zurück.
	 */
	public static function getNewsArticles(){
		$SQL = self::getInstance();
		self::$NewsArticles[] = mysql_fetch_assoc($SQL->receiveData("SELECT ID, Headline, Article, DateTime, FK_User_ID FROM NewsArticles"));
		return self::$NewsArticles;
	}

	/**
	 * Gibt einen bestimmten Eintrag zurück.
	 */
	public static function getNewsArticle($id){
		if(array_key_exists($id, self::$NewsArticles)){
			return self::$NewsArticles[$id];
		}else{
			return null;
		}
	}
}
?>
 
Zuletzt bearbeitet:
Hallo,
in der entsprechenden Zeile greifst du über das $this-Objekt auf die Datenbankverbindung zu ($this->mysql->receiveData...).
Was nicht geht, da du in der statischen Funktion im statischen Kontext bist und dort außerhalb deiner aktuellen Instanz (es gibt das $this-Objekt schlicht und einfach nicht).
Entweder machst du alles statisch (wie in deiner Singleton-Version), was an sich auch nicht so schön is, dafür aber praktisch. Oder du deklarierst alle Variablen und Methoden als Member der Klasse (also nicht-statisch) und speicherst irgendwo eine Instanz deines Models.

mfg, metax.
 
Ja momentan sind es noch meine erstern Versuche mit MVC-Patterns.
Werde bei gg. Zeit das auch alles Umstellen und die Models von einer Base-Klasse extenden etc.
Dort werde ich auch deine Anmerkung bzgl. der Singleton-Variante berücksichtigen.

Vielen Dank!
 
Zurück
Oben