Klassen-Probleme

Hallo miteinander,

Also wenn du mit mehreren Klassen arbeiten willst....solltest du mit Singleton patterns arbeiten.

Das funktioniert ungefähr so.

Z.b. in der index.php lädst du die Klasse singleton.php und startest ein neues Object dieser Klasse:

$singelton = new singleton();

Ich glaub du bringst Singleton und Registry Pattern durcheinander. Denn man benutzt ja den Singleton Pattern, um gerade nicht jedesmal mit new eine neue Instanz der Klasse zu erzeugen.
Beispiel für einen möglichen Singleton Pattern:
PHP:
static public function getInstance() {
	if(self::$thisInstance == null) {
		self::$thisInstance = new ClassName();
	}
	return self::$thisInstance;
}

Der Aufruf erfolgt dann über ClassName::getInstance(). Dadurch ist dann sicher gestellt, dass nur genau eine Instanz erzeugt wird.

So in dieser Klasse kannste jezsozusagen Die Objecte der anderen Klassen speichern...
z.b. einer MYSQL und einer Template Klasse.
so und jez musste halt in den Klassen in den z.b. mysql verfügbar sein muss die Objecte wieder laden.

Die Klasse, die die Instanzen verwaltet, ist ein Registry Pattern. Dieser bietet Methoden, um erzeugte Instanzen zu registrieren, löschen, ermitteln und zu überprüfen, ob schon eine Instanz einer bestimmten Klasse vorhanden ist.
Die Registry-Klasse verwendet meistens einen Singleton Pattern, um eine globale Registry zu gewährleisten.


Radhad, ich habe ebenfalls angefangen ein objektorientiertes Forum zu programmieren, da es bei den Forensystemen, die ich mir angeschaut habe, nicht mit so einfach war, sie in eine bestehende Webseite zu integrieren. Ich habe meine Gedanken zur Objektstruktur mal grafisch in Form eines Diagrammes zusammengefasst (siehe Anhang).
Die index.php erhält zunächst die benötigten Daten (DB-Logindaten etc.) aus der Konfigurationsdatei. Danach werden die Klassen, die sowohl von der Webseite selber als auch von anderen Klassen verwendet werden, initiiert und dann beim globalen Registry-Object registriert.
In meinen Überlegungen wären das die Klasse für die Datenbankanbindung, die Template-Engine und eine Klasse zur Verwaltung der Benutzer, damit für Webseite und beispielsweise Forum, die gleichen User-Informationen und Einstellungen benutzt werden.
Dann werden die spezifischen Klassen erzeugt (Forum, Gästebuch, Counter usw.), welche sich dann im Konstruktor die benötigten Instanzen über die Registry holen.

Nach dieser Struktur würde ich das momentan machen, lasse mich aber gerne einer besseren Variante belehren.

Gruß
Marvin
 

Anhänge

  • 27066attachment.jpg
    27066attachment.jpg
    34,8 KB · Aufrufe: 16
Ich habe mal beim FaDzServer zum Test eine Registry implementiert, in der bis jetzt nur die MySQL Klasse gehalten wird.
Leider trägt das ganze starke Performance-Einbußen mit sich.

Ich weiß jetzt nicht genau ob es an der Registry liegt oder ob mir nur einfach irgendwo ein dummer Fehler unterlaufen ist.

Und noch was:
Gibst du Referenzen der Objekte in deine Registry? Oder immer Objektkopien?

greetz
daddz
 
Das mit der Registry Klasse versteh ich noch nicht so ganz. Ich bräuchte da mal ein konkretes, kommentiertes Beispiel, dann wird es glaub ich klarer für mich. Wenn ich die Aussagen zusammenfasse, käme ich auf folgendes Ergebnis für meine MySQL-Klasse. Allerdings wüsst ich jetzt nicht, wie ich es anwenden soll.
PHP:
<?php

class MySQL
{
	private $host;
	private $port;
	private $username;
	private $password;
	private $database;
	
	public function __construct($host, $username, $password, $database, $port='')
	{
		if (empty($port))
			$port=3306;

		$this->host=$host;
		$this->port=$port;
		$this->database=$database;
		$this->username=$username;
		$this->password=$password;
    }
    
    static public function getInstance()
	{
		if(MySQL::$thisInstance == null)
		{
			MySQL::$thisInstance = new MySQL();
		}
		return MySQL::$thisInstance;
	}
	
	public function server_connect()
	{
		if(!mysql_connect ($this->host.":".$this->port, $this->username, $this->password))
		{
			return false;
		}
		
		mysql_select_db($this->database);

		$sql = "SET NAMES 'utf8'";
		mysql_query($sql);
		
		return true;
	}
	
	function query($query)
	{
		$fehler = false;
		$fehlertext = "";
		
		$ressource = mysql_query($query);
		
		if(empty($ressource))
		{
			$fehler = true;
			$fehlertext .= mysql_error();
		}
		if($fehler == true)
		{
			echo $fehlertext;
		}
		else
		{
			return $ressource;
		}
	}
	
	function num_rows($ressource)
	{
		$rows = mysql_num_rows($ressource);
		
		return $rows;
	}
	
	function affected_rows($ressource)
	{
		$rows = mysql_affected_rows($ressource);
		
		return $rows;
	}
}

?>

Oder muss ich eine Registry-Klasse bauen, wo all die "getInstance()" Methoden enthalten sind?
 
@ Marvin

Ich nutze auch eine Registry Pattern mit Singleton......

Also wollte das nur bissle verständlicher erklären.... ;-)

MFG Niels
 
Hi,
mir ist schon klar was du meinst, nur hörte es sich in deiner Erklärung so an, als würden Singleton Pattern dazu benutzt werden Instanzen zu verwalten, was ja nicht so ist. Wollte das nur richtig stellen.

Radhad, zur Zeit übergebe ich sowohl Referenzen als auch Objekte...
Genaueres kannst du dir hier anschauen.

Gruß
Marvin
 
Zurück