Objekt Orientierte Programmierung in PHP 5 - Anfänger Tutorial
In PHP 4 war die Implementierung von Oop (siehe überschrift) sehr schlecht. In PHP 5 hat sich das gebessert. Obwohl einige leute meinen, Oop im web sei der overkill finde ich es trotzdem sehr gut ;-) Aber was ist überhaupt Oop? Es geht dabei um die programmierung mit Objekten. Objekte werden wie folgt Initalisiert:
[php]$object = new Object();[/php]
Aber was ist jetzt wieder "Object"? Das erinnert doch an eine funktion. Nun, so heißt die Klasse zu unserem neuen Object. Klassen beschreiben ein Objekt - und was wir Objekte nennen ind nur Instanzen der klasse. Dazu ein beispiel, die simpelste denkbare Klasse sieht so aus:
[php]class Object { }[/php]
Sie enthält keinerlei funktionalität. Die funktionalität steckt erst in den Methoden - und wieder ein neuer begriff ;-)
[php]class Object {
function hello_world {
echo "Hello World";
}
}[/php]
hello_world ist eine einfache methode. Sie gibt nur "Hello World" aus.
Aufgerufen wird sie so:
[php]$object->hello_world();[/php]
wobei wir zuvor $object mit new Object() erstellt haben (siehe oben)
Wir können beliebig viele Methoden zu einer Klasse hinzufügen. Wir können sie auch ohne Objekt aufrufen - direkt aus der klasse:
[php]object::hello_world();[/php]
dafür muss allerdings die methode anders deklariert werden:
[php]static function Object() {[/php]
Methoden verhalten sehr ähnlich wie funktionen, sie unterstüzen auch parameter. darauf soll aber an dieser stelle nicht eingegangen werden.
Desweiteren besitzten Objekte Eigenschaften. Sie sind wie Variablen, nur das sie nur für das objekt gelten.
[php]$object->var = "value";[/php]
auch eigenschaften verhalten sich sehrähnlich wie variablen. Ein Objekt kann auf seine eigenden Eigenschaften aus seinen funktionen zugreifen mit $this:
[php]$value = $this->var;[/php]
Jetzt soll es um etwas mehr Praxis mehr gehen, bevor wir uns Weiteren funktionen zuwenden. Schauen wir uns folgendes Beispiel an:
[php]class hund {
protected $alter = 0;
static function bellen() {
echo "Wuff!!";
}
function get_alter() {
echo "Der Hund ist " . $this->alter . " Jahre alt!";
}
}[/php]
die funktionalität der Klasse sollte kalr sein - sie stellt einen hund da. Der kann Bellen und sein Alter kann ausgegeben werden. Aber etwas ist neu: das schlüsselword protected. Was bewirkt es? Einfach gesagt: Das alter kann nicht von aussen ausgelesen werden (jedenfalls nicht über umwege). Dieses verhalten nennt sich Kapselung und kann auch auf methoden angewendet werden. Es spielt eigentlich erst später eine rolle (z.B. bei entwurfsmustern - aber soweit sind wir noch nicht).
Aber um beim beispiel Hund zu bleiben. Angenommen wir wollen jetzt auch eine Klasse für Katzen erstellen. Wir können die alter funktionen behalten. Also einfach per copy und past übernehmen. können wir! Aber dieses verhalten ist sehr unschön, und überflüssig. Deswegen gibt es Vererbung. Wir erstellen eine Klasse Tier. In diese Klasse packen wir nun die alters verwaltung. In die Klassen Hund und Katze kommen nur die eigenden sachen, zu beispiel bellen oder Krallen Ausfahren. Wie übernehmen mit Vererbung die die Eigenschaften und Methoden einer anderen Klasse:
[php]class Hund extends Tier {[/php]
Dafür ist das schlüsselwort extends verantwortlich. Aber zurück zur Kapselung, die eigenschaften von Tier können auch von der Erbenden klasse, also Hund, benutzt werden. Um dieses Verhalten zu verhindern benutzten wir statt protected private. Wollen wir das von überall zugegriffen werden kann nutzen wir public.
wozu das ganze? Nehmen wir an, wir verändern das script. aus $alter wird nun $lebensjahre. wir müssen ohne Kapselung nun alles konvertieren - überall wird aus $object->alter und $object->lebensjahre. Da wir get_alter() unangetastet lassen wäre es inteligenter gewesen von vornerein nur get_alter() zu benutzten - um das zu erzwingen kann kapselung eingesetzt werden. Es wird uns so eine Menge fehleranfälliger arbeit erspart.