5.3 Template Engines und Objektorientierte Programmierung (OOP)
Mit den bisher erklärten PHP-Grundlagen könnten Sie bereits jetzt loslegen. Dennoch würde ich Ihnen gerne das Konzept einer Template Engine vorstellen, wie es TinyButStrong eine ist. Alternativ dazu gibt es viele weitere Template Engines für PHP wie etwa Smarty. Ich habe mich jedoch für TinyButStrong entschieden, da diese übersichtlich gehalten ist und Ihnen viele Grundfunktionalitäten zur Verfügung stellt. Dies bietet sich für einen ersten Einstieg an.
Die Idee einer Template Engine ist es, den PHP-Quellcode von HTML und CSS zu trennen. Dies hat den Vorteil, dass Sie in Ihren HTML-Code nicht wie zu Beginn von Kapitel 5.1 gezeigt stets kleinere PHP-Blöcke einbinden müssen. Es ist demnach so, dass Sie letztendlich jeweils zwei Dateien verwenden, eine für den PHP-Quellcode und eine, in der das Template (also der HTML- und CSS-Code) definiert wird. Der Unterschied eines Templates zu einer normalen HTML-Seite ist der, dass Sie Platzhalter verwenden können, die schließlich mit PHP gefüllt werden. Stellen Sie sich also ein Online-Telefonbuch vor, in dem Sie sich die Details zu einer Person anzeigen lassen können. Der Name, die Telefonnummer usw. sind perfekte Beispiele, die durch Platzhalter (sogenannte Templatevariablen) ersetzt werden können. Das Template selbst sieht für jede Person gleich aus und ausschließlich der Inhalt wird dynamisch im PHP-Code geladen. Ein weiterer Vorteil ist demnach, dass Templates wiederverwendbar und leichter anzupassen sind, da für das Template selbst zunächst keine PHP-Kenntnisse notwendig sind.
Natürlich gibt es wie immer auch Nachteile an der Vorgehensweise der Template Engines. Sie müssen neben PHP auch die Verwendung der Template Engine erlernen, wobei mir meine langjährigen Erfahrungen gezeigt haben, dass es sich unbedingt lohnt. Daher habe ich mich dazu entschieden, Ihnen am Beispiel dieser Webseite gleichzeitig auch die Nutzung von Templates näher zu bringen.
Da es verschiedene Template Engines gibt, die verschiedene Funktionalitäten mehr oder weniger intensiv unterstützen, sind diese natürlich nach Verwendungszweck auch mehr oder weniger geeignet. Hier geht es jedoch erst einmal nur um die Grundlagen und nicht um die richtige Auswahl der geeignetsten Template Engine.
Die Grundidee bei OOP ist es, konkrete Daten in sogenannten Objekten zusammenzufassen. Auf diese Objekte können zusätzlich Funktionen angewandt werden, die das Verhalten dieses Objektes bestimmen. Die Eigenschaften und Funktionen werden durch eine entsprechende Klassendefinition festgelegt. Eine Klasse ist demnach eine Art Bauplan für Objekte und enthält deren allgemeine Beschreibung.
Stellen Sie sich dazu ein Auto vor. Es handelt sich dabei um einen Überbegriff, mit dem etwa viele verschiedene Automarken und Modelle gemeint sein können. Das Auto ist somit eine Klasse, der Sie diverse Eigenschaften zuordnen können. Dies kann zum Beispiel der Hersteller oder auch die Farbe des Autos sein. Zusätzlich können Klassen Funktionen enthalten, die auch häufig als Methoden bezeichnet werden. Diese sind zum Beispiel fahre oder zeigeKmStand. Da es sich dabei lediglich um die abstrakte Definition der Auto-Klasse handelt, benötigen Sie anschließend Objekte dieser Klasse, die auch als Instanzen bezeichnet werden. Eine Instanz der Klasse Auto könnte demnach ein Mercedes CLC in der Farbe schwarz oder ein Seat Ibiza in blau sein.
Zusammengefasst heißt dies, dass Klassen die abstrakte Definition der letztendlich daraus erzeugten Objekte bzw. Instanzen sind und nicht die konkreten Daten enthalten. Da Klassen nicht nur Eigenschaften, sondern auch Methoden enthalten, können Sie dem Mercedes CLC nicht nur die Farbe schwarz zuweisen, sondern auch die Methode fahre auf dieses Objekt anwenden. Im konkreten Beispiel könnte das Auto die zusätzliche Eigenschaft km haben, die beim Aufruf der Methode fahre um 10km hochgezählt wird.
Quellcode 1 zeigt eine Möglichkeit, wie die Klasse Auto in PHP aussehen könnte.
Template Engine
Natürlich gibt es wie immer auch Nachteile an der Vorgehensweise der Template Engines. Sie müssen neben PHP auch die Verwendung der Template Engine erlernen, wobei mir meine langjährigen Erfahrungen gezeigt haben, dass es sich unbedingt lohnt. Daher habe ich mich dazu entschieden, Ihnen am Beispiel dieser Webseite gleichzeitig auch die Nutzung von Templates näher zu bringen.
Da es verschiedene Template Engines gibt, die verschiedene Funktionalitäten mehr oder weniger intensiv unterstützen, sind diese natürlich nach Verwendungszweck auch mehr oder weniger geeignet. Hier geht es jedoch erst einmal nur um die Grundlagen und nicht um die richtige Auswahl der geeignetsten Template Engine.
Kurzeinstieg - OOP
Um mit TinyButStrong arbeiten zu können reichen meines Erachtens die Grundlagen und ein paar Dinge, die Sie sich einfach merken müssen. Dennoch halte ich es für sinnvoll, Ihnen einen kurzen Einstieg in den Programmierstil von TinyButStrong zu geben. Dieser basiert auf dem zurzeit gängigen Stil der objektorientierten Programmierung (kurz OOP).Die Grundidee bei OOP ist es, konkrete Daten in sogenannten Objekten zusammenzufassen. Auf diese Objekte können zusätzlich Funktionen angewandt werden, die das Verhalten dieses Objektes bestimmen. Die Eigenschaften und Funktionen werden durch eine entsprechende Klassendefinition festgelegt. Eine Klasse ist demnach eine Art Bauplan für Objekte und enthält deren allgemeine Beschreibung.
Stellen Sie sich dazu ein Auto vor. Es handelt sich dabei um einen Überbegriff, mit dem etwa viele verschiedene Automarken und Modelle gemeint sein können. Das Auto ist somit eine Klasse, der Sie diverse Eigenschaften zuordnen können. Dies kann zum Beispiel der Hersteller oder auch die Farbe des Autos sein. Zusätzlich können Klassen Funktionen enthalten, die auch häufig als Methoden bezeichnet werden. Diese sind zum Beispiel fahre oder zeigeKmStand. Da es sich dabei lediglich um die abstrakte Definition der Auto-Klasse handelt, benötigen Sie anschließend Objekte dieser Klasse, die auch als Instanzen bezeichnet werden. Eine Instanz der Klasse Auto könnte demnach ein Mercedes CLC in der Farbe schwarz oder ein Seat Ibiza in blau sein.
Zusammengefasst heißt dies, dass Klassen die abstrakte Definition der letztendlich daraus erzeugten Objekte bzw. Instanzen sind und nicht die konkreten Daten enthalten. Da Klassen nicht nur Eigenschaften, sondern auch Methoden enthalten, können Sie dem Mercedes CLC nicht nur die Farbe schwarz zuweisen, sondern auch die Methode fahre auf dieses Objekt anwenden. Im konkreten Beispiel könnte das Auto die zusätzliche Eigenschaft km haben, die beim Aufruf der Methode fahre um 10km hochgezählt wird.
Quellcode 1 zeigt eine Möglichkeit, wie die Klasse Auto in PHP aussehen könnte.
Quellcode 1 - PHP
Diese Beispielklasse zeigt, wie sich Autos objektorientiert abbilden lassen. Zur besseren Verständlichkeit verwende ich ausnahmsweise deutsche Variablennamen.
- <?php
- class Auto
- {
- public $hersteller;
- public $farbe;
- private $km = 0;
- public function fahre($strecke = 10)
- {
- $this->km += $strecke;
- }
- public function zeigeKmStand()
- {
- echo 'Das Auto (ein '.$this->hersteller.' in der Farbe '.$this->farbe.') ist bereits
- '.$this->km.'km gefahren.';
- }
- }
- $golf = new Auto;
- $golf->hersteller = 'VW';
- $golf->farbe = 'silber';
- $golf->fahre(30);
- $golf->fahre();
- $golf->zeigeKmStand();
- ?>
Eine Klasse wird mit dem Schlüsselwort class definiert. Sie sollten die Klassennamen groß schreiben, um diese besser von den Variablennamen unterscheiden zu können. Dies hat sich in der Programmierung eingebürgert, bleibt aber dennoch selbstverständlich Ihnen überlassen. In Zeile 4 bis 6 werden die Eigenschaften der Klasse definiert. Das Wort public sorgt dafür, dass diese Variablen von außerhalb der Klasse ansprechbar sind. Die Variable $km kann aufgrund der Definition mit dem Schlüsselwort private jedoch nicht von außerhalb der Klasse verwendet werden. So ist sichergestellt, dass sozusagen nicht Sie, sondern lediglich das Auto den Kilometerstand verändert.
Neben public und private gibt es noch weitere Modifikatoren, die für das Grundverständnis nicht relevant sind und zum Beginn vollkommen ausreichend sind.
In Zeile 8 bis 11 definiere ich die Funktion fahre, die der aktuellen km-Zahl eine bestimmte Strecke aufaddiert. Wird der Funktion keine Strecke übergeben, so können Sie der Variable einen Standardwert zuweisen, der in diesem Beispiel auf den Wert 10 gesetzt wird. Um in der Funktion auf den km-Wert zugreifen zu können, müssen Sie die Variable $this verwenden. Dies hat den Grund, dass Sie nicht auf irgendeinen km-Wert zugreifen wollen, sondern auf den Wert des aktuellen Objektes. Für $strecke wird $this nicht verwendet, da es sich um eine lokale Variable und nicht um eine Eigenschaft der Klasse handelt.
In Zeile 20 erzeuge ich schließlich ein konkretes Objekt (eine Instanz) vom Typ Auto mit dem Namen $golf. Möchten Sie diesem Objekt Werte für die verschiedenen Eigenschaften zuweisen, so können Sie dies über den ->-Operator tun. Mit Hilfe dieses Operators können Sie genauso auch Funktionen auf das Objekt anwenden.
Wichtig: Achten Sie unbedingt darauf, dass hinter dem ->-Operator kein erneutes Dollarzeichen vorkommt. Dies ist sowohl bei $this, als auch bei der Verwendung des Objektes der Fall.
Über die Funktion zeigeKmStand gebe ich den aktuellen Kilometerstand des Autos aus. Das Ergebnis dieser Funktion für das Beispiel des Golfs lautet: Das Auto (ein VW in der Farbe silber) ist bereits 40km gefahren.
Die 40km werden durch Zeile 23 und 24 gesetzt. Wird der Funktion fahre wie in Zeile 24 kein Wert übergeben, so wird der zuvor in der Funktion selbst definierte Standardwert von 10km verwendet.
Diese Einleitung in die objektorientierte Programmierung wird im folgenden Unterkapitel durch ein paar praktische Beispiele bei der Verwendung von TinyButStrong untermalt und hilft Ihnen dann sicherlich beim Verständnis.