Klassen in PHP5
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
benutzen
code
datei
datenbank
datum
form
formular
funktion
klasse
login
methode
moment
objekt
post
session
term
update
verbindung
zeug
-
Hallo
ich benutze schon einige Zeit Klassen in PHP5, allerdings fehlt mir noch ein wenig das Verständnis.
Im Moment habe ich 2 Klassen, eine die alles mit der Datenbank regelt und eine die alles andere steuert.
Das Ganze sieht viel zu grob aus.
Kann es sein das es geschickter wäre die Datenbankklasse aufzuteilen, in eine Klasse die
- die Verbindung herstellt,
- die Daten ausliest,
- die Daten schreibt
Dann müsste ich ja
$con = new connection(); $read = new read(); $write = new write();
schreiben und die Klassen includen.
Dann wäre es villeicht sinnvoll, wenn ich die Klassen vererben lasse?!
<?php class error { public function open(){return new self;} public function logData(){ // schreibe in Datei ... // } } class connection{ private $host = "localhost"; private $user = "user"; private $pass = "passwort"; private $db = "datenbankname"; protected $con = false; protected $values = array(); public function connect() { try{ $this->con = mysql_connect($this->host,$this->user,$this->pass); if($this->con) mysql_select_db($this->db,$this->con); else throw new MyException("Keine Datenbankverbindung möglich"); } catch(Exception $e){ error::open()->logData($e); } } public function __get($key){ try{ if(in_array($key,$this->values)) return $this->values[$key]; else throw new MyException("Value: ".$key." nicht vorhanden!"); } catch(Exception $e){ error::open()->logData($e); } } public function __set($key,$value){ $this->values[$key] = $value; } } class read extends connection{ public function dataSelect(){ // SELECT * FROM ... // } } class write exteds connection{ public function dataInsert(){ // INSERT INTO ... // } public function dadaUpdate(){ // UPDATE ... SET ... // } } $read = new read(); $write = new write(); ?>
__get() & __set() brauch ich damit ich die SQL-Querys zusammenbauen kann wie z.B. so:
$read->selector = "*"; $read->table = "eine_tabelle"; $read->terms = array("id"=>10,"name"=>"mustermann"); $read->dataSelect();
Ohne setter /getter müsste ich dann wohl mehr Methoden schreiben:
$read->selector("*")->table("eine_tabelle")->terms(array("id"=>10,"name"=>"mustermann"))->dataSelect();
Der SQL-String wird dann etwas so zusammengebaut:
"SELECT ".$this->selector." FROM ".$this->table." WHERE ".$this->terms."
Meine Frage ist nun, ob das so sinnvoll ist, das ich das für "$write" dann $write-> benutzen muss.
Im moment steht alles in einer Klasse und ich schreibe nur $sql->selector(); $sql->update(); ...
Mir fehlt also im moment das Verständis wie man diese ganzen Klassen dann sinnvoll nutzt.
Wär schön wenn mir da jemand tipps geben könnte.
Grüsse
Color
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ich würde das wenn dann so machen:
Du hast eine Klasse Query, davon wird eine instanz erstellt, das sql-query übergeben und man hat dann attribute wie affected_rows, inserted_id, ..
Und dann hast du eine Klasse SelectQuery oder so, die erweitert Query und bietet deine selector, table, etc. attribute und methoden zum fetchen etc.
Und dann noch eine Datenbankklasse, die stellt die verbindung zur Datenbank her uÄ. -
Seh dir mal die PHP-eigene Klasse PDO (PHP Data Objects) an. Das ist PHPs vorbildliche Klasse für Datenbankzugriff. Ich denke diese Struktur beizubehalten wäre sehr klug. Man hat also einmal die Datenbankklasse (PDO) und die Statementklasse (PDOStatement), sowie eine eigene Exception (PDOException).
Übrigens, wofür machst du das überhaupt? Zum Üben? Wenn das für produktiven Einsatz sein soll, dann vergiss es lieber schnell und stell dir die Queries selbst zusammen. Das was du machst ist langsam und du müsstest das bei steigenderen Anforderungen immer weiter erweitern. (Wenn du dann statt ner einfachen Tabelle einen LEFT OUTER JOIN auf einen anderen SELECT machst, wünsche ich dir viel Spaß das zu implementieren ;) -
Hi,
die Sachen mit den JOINS hab ich schon gelöst, mehrere Tabellen gleichzeitig auslesen etc.
Ich habe Funktionen die mir mit ner rekursivenschleife alle WHEREs und JOINs und INs zusammenbasteln.
Ich will die Querys nicht selber tippen, ich will daten reinschicken und fertig rausbekommen. Prozedural will ich hier mal nicht einsetzen,
ich erstell Templates mit html css und shorttags. Dann lad ich einfach noch das Array in die Seite ein.
Dazu habe ich eben einige Bereiche wie Login, Content, Navigation und noch ein paar. Den Content und die Navigation lad ich z.B. mit XML ein.
Auch hier hab ich mir funktionen geschrieben die ein Array rekursiv in ein XML Dokument parsen. Auch ne Suchfunktion für Arrays.
Das würde ich z.B. wieder in ne XML-Klasse
Eine Loginklasse welche die session_id verwaltet und die Logindaten.
Obs das Projekt an sich Sinn macht is egal. Ich will nur meine Kenntnisse in PHP/OOP steigern.
nikic schrieb: Seh dir mal die PHP-eigene Klasse PDO (PHP Data Objects) an. Das ist PHPs vorbildliche Klasse für Datenbankzugriff.
Werd ich mir anschauen. Danke :) -
Also es ist einfach so das PHP leider keinen Vorteil durch Objekt Orientierter Programmierung hat. Es wird eher langsamer denn man kann keine instanzierten Objekte dem nächten Seitenaufruf weitergeben und ist es umsonst... Einziger vorteil ist das Leute die von einer OOP Sprache kommen leichter einen Zugang zu PHP finden....
Also bei PHP einfach eine saubere Strukturierte Programmierung anwenden. Also für jedes Thema Sprich Mysql, Bildbearbeitung, Formulare ect. eigene PHP include Files erstellen. Diese beinhalten wiederum Funktionen die dann überall verwendet werden können.
Also ich finds ehrlichgesagt leichter als OOP. Is Geschmacksache und sicher auch Übung... -
finch:
Bitte was?
Was du da sagst ist so lächerlich, dass ich garnicht weiss, wo ich anfangen soll, es zu widerlegen.
Ohne OOP wirst du keine Webseite scripten können, die über "Hallo Welt" hinausgehen und trotzdem von anderen Programmierern verstanden werden soll.
QFT:
Also ich finds ehrlichgesagt leichter als OOP. Is Geschmacksache und sicher auch Übung...
Das sagt ja eigentlich auch schon alles: du hast schlichtweg keinen Plan von objektorientierter Programmierung und meinst, dass sie deshalb unnötig sei.
styVe (qap2-Team) -
Im Grunde genommen ist deine EInteilung in diese 2 Klassen ganz gut, denn bietet die Datenbankklasse doch die Schnittstelle von PHP zu deiner Datenbank. Diese noch aufzuteilen wäre meiner Meinung nach sinnfrei, da sich diese Klasse wohl kaum groß ändern wird, das sie ja ne definierte Schnittstelle ist. Also meine Meinung lass es und teil es nicht auf.
-
Hi
danke für eure Beiträge.
Ganz ehrlich, auf den ersten Blick mag OOP vilelicht etwas umständlich und komplizierter sein, aber deswegen Include-Dateien erstellen mit Funktionssammlungen, is n bissl plump.
Ich würde sagen nur allein schon das man die "funktionsgruppen" mit einem bestimmten "Bezeichner" aufrufen kann, ist es schon wert, mit Klassen zu arbeiten.
Sonst hast 100 funktionen irgendwo verteilt in Include-Dateien, wenn man mit OOP etwas intelligend arbeitet, findet man das Zeug, weil man weis in welcher Klasse man suchen soll.
Also, das mit der Datenbank war nur eine Idee. Was mein eig. Problem is, dass ich 2 Klassen habe:
<? class sql{ // Zeug // } class data extends sql{ // Zeug // } $data new data(); ?>
in der Klasse SQL hab ich halt alle reingedrückt, was ich brauche um meine JOINs / INs / ORDER BY / .... umbauen kann um es dann einfach per $data->selectData() / $data->updateData(); $data->deleteData(); $data->insertData(); benutzen kann.
In der Klasse data(); habe ich allerdings alles reingestopft was ging, ich checke die Loginsession ab, ich formatiere XML in ein Array um und wieder das Array in XML zurück. Ich Checke Form-Eingaben und schicke sie weiter in die SQL-Klasse, ich prüfe auf GET / POST alles eben.
Ich denke eben das es klüger wäre das in etwa so zu schreiben:
<? class sql{ // Zeug // } class form extends sql{ } class login extends sql{ } class something extends sql{ } $form new form(); $login new login(); $something new something(); ?>
Aber, jetzt hat es ja in der login() auch Form-Input, Nickname und Passwort, das sollte wohl auch noch durch die form() laufen oder?
Und da man login() auch nur einmal benötigt, und zwar nach dem abschicken des Login-Formulars, brauchen wir hier auch kein "new login()".
Das hier würde ich jetzt als sinnvoll bezeichnen:
<? class data{ protected send; protected session; public function formData($get,$post){ // $this->send[] = // $_GET // $_POST // speichern // } public function sendData($value){ return $this->send[$value]; } public function setSession($sessionID){ $this->session = $sessionID; } } class sql{ static public function build(){return new self;} // Zeug // } class form{ // hiddenfeld-name:login // function checkForm(){ switch($this->HiddenFieldName){ case("login"): login::build()->checkUser(); break; } } } class login extends data{ static public function build(){return new self;} private checkUser(){ $logged = sql::build()->tables("user")->params(array("nick"=>parent::sendData("nick"),"pass"=>parent::sendData("pass")))->selectData(); // Mach was damit ... // } } session_start(); $data = new data(); $_SESSION = form::checkForm($data->sendData("formtype")); /* if($_SESSION["login"] == session_ID()) // Eingeloggt // else // Ausgeloggt / Fehler // */ ?>
Ob da nun kleine Sachen drin sind wie "So würde das nie funktionieren weil da ein Komma fehlt" sind jetzt erstmal egal.
Aber eigentlich, ist der Sinn der einzelnen Klassen schön zu verstehen.
Dumm is halt, das die Klassen alle voneinander abhängig gemacht werden. Ich erstelle immer dann neue Objekte wenn ich sie Brauche. Aber ich hab sie dann net ständig irgendwo rumhängen.
Was sagt ihr dazu?
Grüsse
Color -
An sich ganz ok, aber wie du selber sagst sobald Klassen voneinander abhängig sind, ist das ganze immer nicht mehr so schön. Mit der Aufsplittung der einen Klasse haste durchaus Recht, aber ich dachte ja mehr du wolltest die SQL-Klasse aufsplitten. Da hab ich mich wohl verlesen. Ne so aufn ersten Blick ohne genauer in den Code zu gucken, würde ich die Struktur so auch befürworten.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage