Codeschnipsel
Ein Gästebuch mit OOP
Dieses fortgeschrittene Tutorial setzt allerdings einige Grundkenntnisse vorraus und ist daher für Anfänger ungeeignet.
Erstmal will ich jedoch einige Begriffe im Voraus klären:
OOP => Objektorientertes Programmieren
Methode => Nennt man die Funktion in einer Klasse
Eigenschaft => Nennt man die Variablen einer Klasse, weil diese später auf das Objekt übertragen werden, nennt man es Eigenschaften des Objekts
Objekt => Eine Varibale, auf die eine Instanz einer Klasse abgelegt ist
Instanz => der new-Operator erzeugt eine Referenz der Klasse auf das Objekt, diese nennt man Instanz
Vorraussetzungen
Du musst mit der Sprache PHP schon etwas besser vertraut sein und eventuell einige Grundkenntnisse in OOP mitbringen (Was sind Klassen, wie werden sie benutzt)
Einen kleinen Einstieg bietet diese Seite:
http://www.php-kurs.com/objektorientierte-programmierung-in-php.htm
Nun zu den Vorrausetzungen, die euer Server mitbringen muss:
Zum 2ten Punkt komme ich später, testen könnt ihr euer Server darauf so:
|
Es müssen beide Punkte erfüllt sein, denn andersfalls macht dieses Tutorial weiter keinen Sinn, wenn dein localhost dieses also nicht unterstützt, rate ich auf http://www.bplaced.de/ da ist alles vorhanden.
Im Vorraus: Jede Klasse und Interface bekommt seine eigene Datei, zB NameDerKlasse.class.php,
was aber vorrausgesetzt und nicht weiter erwähnt wird. Außerdem wird eine Datenbank mit der Tabelle 'gbook' benötigt, wie folgenden Aufbau hat:
|
PDO
PDO (PHP Data Object) ist eine Schnittstelle, mit der man versch. Datenbanken ansprechen und über SQL (Structured Query Language) Daten verarbeiten kann. Dafür müssen wir erstmal eine Instanz dieser Klasse bekommen, zB so:
|
Allerdings benätigt PDO die Verbindungsdaten,
weshalb der Code so noch nicht funktioniert. Wir wollen aber auch verhindern, dass man nicht 2 oder mehr PDO-Objekte erstellen kann, 1. wäre das überflüsig und 2. wollen wir uns nicht 2 oder mehrmals verbinden, sondern nur einmal. Deshalb benutzen wir eine Klasse namens 'db_sql', mit der wir uns eine Instanz von PDO holen. So siehts sie aus:
db_sql.class.php
|
PDO erwartet 4 Parameter, 1. die Art der Verbindung, also Infos über die Datenbank 2. Der Benutzername 3. das Passwort und 4. können wir optional Einstellungen vornehmen. mit PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING setzen wir den Fehlermodus auf Warning, womit wir bei feherhaften SQL einen Fehler bekommen. Wie könnten auch PDO::ERMODE_SILENT benutzen, welches und keine Fehler mehr anzeigen würde.
1. Interface
Nun kommen wir zu unseren Grundüberlegungen, was soll unser Skript können? Oder anders gesagt, welche Funktionen soll es haben. Per Interface (=Schnittstelle) geben wir vor, welche Methoden eine Klasse haben muss, damit alles richtig funktioniert. Sind nicht alle Vorderungen des Interfaces erfüllt, erhalten wir eine Fehlermeldung. Unser Gästebuch soll also folgendes können:
Also sieht demnach unser Gästebuch-Interface so aus:
gbookInterface.class.php
|
Die Methode __call wird dann aufgerufen, wenn das Objekt versucht, eine Methode aufzurufen, die es gar nicht gibt. Im Normalfall kommt bloß eine Fehlermeldungen, aber wir könnten auch etwas anderes machen ... Diese gute Fehlerbehandlung ist auch ein großer Vorteil von OOP.
Unsere Gästebuch Klasse
Diese Klasse muss nun alle Vorrausetzungen des Interfaces erfüllen, Interface werden mit dem Schlüsselwort implements in die Klasse mit implementiert. Wir benutzen auch die Methode __construct, welche aufgerufen wird, sobald ein Objekt dieser Klasse erstellt wird. Wir wollen per Konstruktor und mit der Datenbank verbinden, also holen wir uns eine Instanz von PDO. Dafür müssen wir bloß die Methode der Klasse db_sql aufrufen, da wir diese als static deklariert haben, geht dies, ohne ein Objekt der Klasse zu besitzen. Solch einen Aufruf ist einstatischer Aufruf. Dieser sieht so aus: Klasse::Methode() So sieht die Klasse bis jetzt nun aus, mit einigen Eigenschafften:
gbook.class.php
|
show_entries
Bis jetzt tut sie nichts, außer sich mit der Datenbank zu verbinden.Also erstellen wir nun die nächste Methode (in Interface gucken), ok, also kommt jetz show_entries(), um die Einträge ausgeben zu lassen. Die Funktion von PDO wird in der Methode erklärt...
|
Diese Methode funktioniert noch ohne Blätterfunktion, aber das soll und vorerst nicht weiter stören. Aufällig ist die Klasse template, dadurch wird das Template unseres Gästebuch ausgegeben. Die Funktionsweise dieser Klasse finden Sie im Laufe des Tutorials schon noch raus 😉 Die Template-Klasse gibt es anschließend zum Download. Das Template sieht nun wie folgt aus:
gbook.htm
|
Die Template Klasse, auf die wird nicht weiter eingegangen, die ist einfach nur zum Verwenden da
template.class.php
|
Nun ist schon diese Methode schon voll funktionsbereit, legen Sie nun alle Klassen in extra Dateien mit NameDerKlasse.class.php in den Ordner "class/" ab. Die Templates kommen in den Ordner "templates/". Die Tempates haben die Endung .htm. Wenn wir nun alle Klassen und Interface includieren, ein Objekt erzeugen und anschließend die Methode aufrufen, sehen wir schon, dass es funktioniert :).
|
eintragen
Nun die nächste Methode oder auch "Funktion unseres Skriptes" (ins Interface gucken), ok, also einen Eintrag hinzufügen. Die Kommentare sollen alles weitere eigentlich ausreichend genug erklären:
|
Das dazugehörige Template:
|
Klasse um Admin erweitern
Nun müssen wir nur noch diese Methode aufrufen, wenn es POST-Werte gibt und unser Gästebuch ist fertig! Und was nun? Ich will aba ne Admin-Funktion haben ... hm, dann schreib ich den Code mal um... Das muss nicht sein! Jetzt kommt der große Vorteil von OOP, wir können unsere Klasse nun erweitern. Darauf hin brauchen wir natürlich wieder ein Interface, dass die neuen Methoden der neuen Klasse auflistet. Was soll unser Admin denn alles können? Das Interface verrät es uns!
gbookAdmin.class.php
|
Neue Admin Klasse
Unsere neue Klasse muss nun noch mehr können. Aber dann haben wir ja 2 Objekte, die alte und neue Klasse. Um das zu verhindern, gibt es in OOP die vererbungen. Damit erbt unsere neue Klasse alle Methoden und Eigenschafften der Elterklasse (hier gbook). Vererbung funktioniert über das Keyword extends. Aber Achtung! Eine Klasse kann nur eine weitere Klasse erben, mehr nicht, jedoch kann eine Klasse mehrere Interface implementieren. Ich gebe die neue Klasse mal sofort komplett, damit dieses Tutorial nicht noch länger wird. Die Kommentare sollten alles ausreichend erklären.
gbookErweitert.class.php
|
Zugriffsrechte
Nun müssen wir bloß ein Objekt dieser Klasse erzeugen und wir haben zugriff auf alle mit public gekennzeichneten Methoden und Eigenschafften. Protected bedeutet, Zugriff nur für die eigene- und Kindklassen. Bei private hat nur die Eigene Klasse Zugriff. Dadurch kann man genau definieren, was der User und/oder Anwender unserer Klasse darf, und was nicht. Daher ist sinnvoll, die Zugangsdaten der Datenbank beispielsweise auf private zu setzen.
Die __autoload Funktion
Soweit so gut, aber eines fehlt noch: Die Klasse und ihre Methoden zum richtigen Zeitpunkt benutzen. Aber wir wollen nicht in unsere index.php alle Klassen einzelnd per require_once() einbinden, und genau dafür gibt es seit php5 die __autoload Funktion. Diese Funktion wird immer aufgerufen, wenn der new-Operator eingesetzt wird und die Instanz einer Klasse auf ein Objekt ablegt. Der Übergabe Parameter der __autoload Funktion ist der Name der Klasse, man könnte es also ganz simpel so machen:
|
Aber das ist nicht so gut, da ein Objekt der gleichen Klasse mehrmals erzeugt werden kann (Beispiel template-Klasse), wird die Datei auch mehrmals eingebunden (obwohl once das eig schon verhindern). Schöner wäre es zu Prüfen, ob es die Klasse oder Interface noch nicht gibt und erst dann includieren, deshalb hier eine besser Version der __autoload Funktion:
|
Nun brauchen wir uns nie wieder um das Einbinden der Klassen kümmern, sondern müssen sie bloß in den richtigen Ordner abspeichern und können sie sofort verweden 😉
Anwendung der Klassen
Aber eines fehlt noch: Wann wende ich zum richtigen Zeitpunkt die richtigen Methoden an? Sowas wird meist über die URL und GET-Parameter gelöst. Ist der und der GET-Parameter gesetzt, wird die und die Methode ausgeführt. Man könnte es mit einer riesigen switch-Anweisung lösen oder so ganz einfach:
|
Keine Angst: Sollte etwas falsches in der URL stehen, kümmert sie __call darum. Aber nun kann er per GET alle Methoden einfach so aufrufen! Auch das ist kein Problem, da nur die Methoden aufgerufen werden können, die auf public gestellt sind, und das sind nur die Methoden, bei denen der öffentliche Zugriff erlaubt ist 😉
Die index.php einmal insgesamt:
|
Nur noch die Templates etwas bearbeiten und die Links setzen, zB: <a href="?eintragen">Ins Gästebuch eintragen</a>, um einen Eintrag zu erlauben.
Fertig
Ich hoffe, die Vorteile von OOP sind jetzt mal deutlich geworden, wenn man jetzt zB noch eine Kommentarfunktioneinbaun will, einfach im Template den entsprechenden Link setzen und die Methode dazu schreiben und fertig.
Demo
Auf bplaced habe ich eine Demo zu diesem Tutorial hochgeladen, ich habe bloß die Templates bearbeitet und etwas CSS hinzugefügt (PS: Habe zum Spaß FF-Spezifische CSS-Befehle benutzt, das GB sieht also nur dort schön aus ;))
Man könnte jetzt auch andere Templates schreiben und das GB nochmal anders aussehen lassen, das auch wieder ein Vorteil von Templates, der Grafiker kann sich dort ohne lästigen PHP-Code austoben.
Danke schonmal für das Lesen dieses langem Tutorials,
sollten sich Fehler eingeschlichen haben, bitte bescheid sagen 😉
Freue mich wie immer sehr über euer Feedback, ich stelle auch alle Dateien
(wie sie aufm Server bei bplaced sind) noch einmal zum Download bereit.
Für die Gäste
Download
Wenn ihr noch wissen wollt, weshalb ich require anstatt include, single qoutes (') statt double (") oder echo statt print verwende, fragt einfach extra oder ich werde es auf Wunsch allen erklären, denn das hat schon seinen Grund.
Gruß,
Basti
Kommentare
Autor B.C.