Klassen-Probleme

Radhad

Erfahrenes Mitglied
Hallo zusammen,

ich habe ein Forum mit PHP konstruiert und möchte dies jetzt in OOP umsetzen. Allerdings stehe ich imo ein bisschen auf dem Schlauch, wie ich das richtig machen soll.

Derzeit habe ich folgende Klasse für die Datenbank:
PHP:
<?php

class MySQL
{
	private $server = "localhost";
	private $user = "root";
	private $password = "";
	private $db = "forum";
	
	function server_connect()
	{
		if(!mysql_connect ($host, $user, $password))
		{
			return false;
		}
		
		mysql_select_db($db);

		$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)
		{
			return $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;
	}
}

?>
Und bisher folgende Klasse für das Forum:
PHP:
<?php

class Forum
{	
	public function show_forums()
	{
		$ressource = $MySQL->query("SELECT forumid, forumname, description, showorder, parentforumid FROM forums ORDER BY parentforumid AND showid");
		
		if(is_string($ressource) == true)
		{
			echo $ressource;
		}
		else
		{
			return $ressource
		}
	}
	
	public function create_forum($id, $name, $desc, $parentid = 0)
	{
		$ressource = $MySQL->query("SELECT * FROM forums WHERE parentforumid = ".mysql_real_escape_string($parentid).";");
		$rows = $MySQL->num_rows($ressource);
		
		$ressource = $MySQL->query("INSERT INTO forums (forumid, forumname, description, showorder, prentforumid) VALUES (".mysql_real_escape_string($id).",'".mysql_real_escape_string($name)."','".mysql_real_escape_string($desc)."',".mysql_real_escape_string(($rows+1)).",".mysql_real_escape_string($parentid).")");
		$rows = $MySQL->num_rows($ressource);
		
		if($rows == 0)
		{
			return false;
		}
		else
		{
			return true;
		}
	}
}

?>
1. Frage hierzu: sind die Klassen so in Ordnung? Habe ich irgendetwas falsch bedacht?
2. in der Klasse "forum.class.php" nutze ich die Funktion "show_forums()", welche mir alle Foren anzeigen soll. WIe mache ich die Ausgabe am besten? Momentan gebe ich die Ressource zurück. Sollte ich dann ne eigene Funktion zur Aufbereitung der Felder haben?


Gruß Radhad
 
Beim ersten Blick faellt mir auf, dass Du die Zugangsdaten zur Datenbank und den Namen der zu nutzenden Datenbank fest in der Klasse verankerst. Besser/flexibler waere hier meiner Meinung nach auf jeden Fall die Nutzung des Konstruktor. Diesem kannst Du bei der Instanziierung eines Objektes die noetigen Daten uebergeben und musst sie somit nicht fest in die Klasse setzen.
Der Vorteil daran ist dass Du die Klasse dann auch ganz einfach fuer andere Projekte nutzen kannst (was ja Teil des Sinnes der OOP ist -> wiederverwendbarer Code) und auch einfacher anderen Usern zur Verfuegung stellen.

Hier mal der Konstruktor und der dazugehoerige Aufruf aus meiner Klasse.

PHP:
	public function __construct($host,$database,$username,$password,$type='mysql',$port='')
	{
		if (empty($port))
			{
				if ($type=='mysql')
					{
						$port=3306;
					}
				elseif ($type=='pgsql')
					{
						$port=5432;
					}
				elseif ($type=='mssql')
					{
						$port=1433;
					}
			}
		$this->host=$host;
		$this->port=$port;
		$this->database=$database;
		$this->username=$username;
		$this->password=$password;
		$this->type=$type;
		$function='connect_'.$this->type;
		$this->dbresource=$this->{$function}();
	}
PHP:
$mysql=new multisql(DBHOSTNAME,DBDATABASE,DBUSERNAME,DBPASSWORD,DBTYPE);
 
Ok, der Einwand ist berechtigt ;)

Hier die neue class.mysql.php:
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;
    }
	
	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)
		{
			return $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;
	}
}

?>


Nachtrag:
Wie bau ich denn das jetzt richtig mit dem Forum und der Datenbank-Klasse auf? So wie ich es da stehen habe, klappt es leider nicht :( Anscheinend muss ich die MySQL-Anweisungen außerhalb der Forum-Klasse verwenden.
 
Zuletzt bearbeitet:
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();

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.

also z.b. im Konstruktor dann mit einer Funktion die gespeicherten Instanzen laden und dann kannste mit denen auch arbeiten...

Such ma bei google nach Singleton Patterns...kann ich wirklich nur empfehlen ;-)

MFG Niels
 
Oh man - davon hab ich ja noch nie gehört ^^ Ich glaub das übersteigt momentan meinen Horizont. Kann mir das jemand irgendwie einfach erklären? Die ersten Links & hier das Tut dazu fand ich schon zu kompliziert...

Was ich verstehe, ist, dass die vorhandene Instanz zurück gegeben werden soll und weiter verwendet werden soll. Aber mehr auch nicht.


Gruß Radhad
 
Definier eine MainKlasse die die benötigten Klassen hält.
Innerhalb der deiner MainKlasse definierst die MainKlasse selber als statisches Member
und machst die vià eines Propertys verfügbar (MyClassName->Instance).
Versieh das Property aber nur mit einem Getter. In der Propertydefinition instanzierst die Klasse
wenn auf die Klasse das erste mal zugegrifen wird, also wenn sie noch null ist.

Danach erreichst die Instanz der Klasse bequem über ihren Klassennamen.

Beschätige dich besser mal nebenbei/vorweg mit Java oder C#, während/bevor Du dich an eine Scriptsprache herran machst,
in die die OOP erst nachträglich hinzugefügt wurde. Somit lernst besser die Möglichkeiten der OOP kennen,
da die Sprachen darauf ausgelegt sind so gut wie nichts verzeihen im Gegensatz zu PHP.
 
OOP habe ich gelernt (vor allem im Umgang mit C++ und MFC) aber Singleton Patterns sind mir dabei nie begegnet...
 
Ja SingletonPatterns sind daher gut, da du von jeder Klasse nur jeweils GENAU 1 Object erstellst.....daher ist es dann später auch leichter für bestimmte Zwecke das Objekt auszulesen usw.... z.b. die Zählung der Mysql Queries oder sonst was^^

MFG Headymaster
 
Na die nächste Stufe währen ja dann die Patterns. :)
Vorraussetzung dafür währe ja das Verständniss für die OOP.
Was aber schlecht an mit einer Sprache zu lernen ist, die nicht darauf ausgelegt wurde,
das war lediglich meine Intension in dem Zusammenhang.

Der Singleton Pattern war übrigens auch mein erster Pattern den ich kennen gelernt hab.
Möcht wetten das es bei den meisten von euch nicht anders war. :D
 
Zuletzt bearbeitet:
Mehr Pattern kenn ich auch noch nicht^^

Habe die Singleton Variante erst vor 2 weeks kenngelernt :)

Auch PHP bin ich ja auch noch nicht so lange dabei....

Was gibt es denn noch für Pattern-Varianten mit welchem Zweck...würd mich total interessieren :)

MFG Niels
 
Zurück