Vererbung von Klassen mit PHP

3 | 18888 Aufrufe
Sie können diese Wikiseite nach der Anmeldung auf Webmasterpro bearbeiten. Helfen Sie mit und verbessern Sie "Vererbung von Klassen mit PHP" mit Ihrem Wissen!

Anzeige Hier werben

Oft benutzt man heutzutage objektorientierte Ansätze in seinen PHP Anwendungen, um elegant an Problemstrukturen wie wiederholten Quelltext heranzugehen. Ich erläutere in diesem Artikel, was die Vererbung von Klassen ist und wie man diese einsetzt. Dieser Artikel benötigt mindestens PHP 5, da er auf den neuen objektorientierten Möglichkeiten davon aufsetzt.

Grundgedanke

Stellt euch vor, wir möchten verschiedene Autotypen als Klassen darstellen. Wir nehmen einfach einmal einen VW, einen Audi und einen Mercedes. Grundsätzlich, und um das Beispiel möglichst einfach zu gestalten, haben diese einen Motor, eine Geschwindigkeit und vier Räder. Dann gibt es eine Funktion zum Festlegen der Geschwindigkeit und zum Ermitteln der Geschwindigkeit. Wir könnten diese Klassen zum Beispiel so erstellen:

Beispiel für die drei Autoklassen  
PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php
class VW
{
    protected $engine = "150 PS";
    protected $tireCount = 4;
    protected $speed = 0;

    public function setSpeed($newSpeed)
    {
        $this->speed = $newSpeed;

        return $this;
    }

    public function getSpeed()
    {
        return $this->speed;
    }
}

class Audi
{
    protected $engine = "200 PS";
    protected $tireCount = 4;
    protected $speed = 0;

    public function setSpeed($newSpeed)
    {
        $this->speed = $newSpeed;

        return $this;
    }

    public function getSpeed()
    {
        return $this->speed;
    }
}


class Mercedes
{
    protected $engine = "180 PS";
    protected $tireCount = 4;
    protected $speed = 0;

    public function setSpeed($newSpeed)
    {
        $this->speed = $newSpeed;

        return $this;
    }

    public function getSpeed()
    {
        return $this->speed;
    }
}
?>

Wer genau aufgepasst hat, merkt hier schon eine kleine Sache, die nicht elegant gelöst ist: Wir müssen in allen Klassen die Eigenschaft $speed und die Funktionen setSpeed und getSpeed neu definieren. Da benutzen wir OOP um sich wiederholenden Code zu vermeiden, und dann müssen wir doch Code doppelt schreiben?! Nein, eben nicht. Aus diesem Grund kann man Klassen von anderen Klassen ableiten. Dieser Vorgang wird Vererbung genannt. Auf Wikipedia (http://de.wikipedia.org/wiki/Vererbung_%28Programmierung%29) gibt es dazu mehr Informationen.

Verbesserung unseres bisherigen Ansatzes

Wir wollen unseren bisherigen Ansatz überarbeiten und müssen nun überlegen, welche Funktionen und Eigenschaften wir in jeder Autoklasse (VW, Audi, Mercedes) zur Verfügung haben wollen. Aus dem bisherigen Ansatz sind das auf jeden Fall die Eigenschaft $speed, $tireCount und die beiden Funktionen setSpeed() und getSpeed(), damit wir diese nicht ständig neu schreiben müssen für jede Klasse. Der neue Quellcode kann nun so aussehen:

Überarbeiteter Ansatz  
PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
class Car
{
    protected $tireCount = 4;
    protected $speed = 0;

    public function setSpeed($newSpeed)
    {
        $this->speed = $newSpeed;

        return $this;
    }

    public function getSpeed()
    {
        return $this->speed;
    }
}

class VW extends Car
{
    protected $engine = "150 PS";
}

class Audi extends Car
{
    protected $engine = "200 PS";
}

class Mercedes extends Car
{
    protected $engine = "180 PS";
}
?>

Hier ist ein neuer Begriff dazugekommen, der euch eventuell nicht geläufig ist: "extends". "class VW extends Car" bedeutet zum Beispiel, dass sich die Klasse VW von der Klasse Car ableitet, und somit alle Eigenschaften erhält, die die Klasse Car zuvor besaß. Die VW Klasse besitzt nun also nicht nur die Eigenschaft $engine, sondern zusätzlich $speed, $tireCount und die Funktionen setSpeed() und getSpeed(). Wenn wir jetzt noch mehr Funktionen hinzukommen lassen möchten, wie etwa Anzahl der Sitze ($seatCount), schreiben wir diese Eigenschaft nun nicht mehr in jede Klasse einzeln, sondern erweitern nur noch unsere Klasse Car:

Erweiterte Car Klasse  
PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Car
{
    protected $tireCount = 4;
    protected $speed = 0;
    protected $seatCount = 5; // Zwei Frontsitze und drei Rücksitze

    public function setSpeed($newSpeed)
    {
        $this->speed = $newSpeed;

        return $this;
    }

    public function getSpeed()
    {
        return $this->speed;
    }

    public function getSeatCount()
    {
        return $this->setCount;
    }
}

?>

Nun haben wir in jeder Klasse auch die Anzahl an Sitzen zur Verfügung. Da unser VW aber nicht nur ein normales Familienauto, sondern ein Van ist, haben wir ganze acht Sitze zur Verfügung. Die Vererbung von Klassen ermöglicht es uns, auch Werte von abgeleiteten Klassen zu überschreiben, wie etwa die Anzahl der Sitze ($seatCount). Hier ist die neue VW Klasse:

Neue VW Klasse  
PHP
1
2
3
4
5
6
7
<?php
class VW extends Car
{
    protected $engine = "150 PS";
    protected $seatCount = 8;
}
?>

Mehr müssen wir an dieser Klasse nicht ändern. Die Funktion getSeatCount(), die aus der Klasse Car übernommen wird, erkennt die neue Zahl an Sitzen und gibt die richtige aus. Ich stelle mir das immer wie zwei Ebenen oder zwei Blatt Papier, eins mit Löchern und eins ohne, vor. Das untere, heile Papier zeigt alle Eigenschaften und Funktionen an. Nun legen wir das neue Blatt Papier darüber. Überall, wo die Löcher sind, sind die alten Eigenschaften sichtbar. Außer die Eigenschaft der Sitzanzahl. Dort wurde auf dem Blatt Papier ein neuer Wert geschrieben.

Weitere Verbesserung

Nun, da ihr wisst, dass man bestehende Werte von abgeleiteten Klassen überschreiben kann, könnten wir auch die Eigenschaft $engine in die Klasse Car übernehmen und dann immer für jede abgeleitete Klasse überschreiben.

Vererbung über mehrere Generationen

Vererbung geht aber nicht nur über eine Generation, sondern auch über mehrere hinweg. Zur Veranschaulichung kann man sich vorstellen, dass wir nicht nur Autos, sondern auch Motorräder kategorisieren möchten. Nun haben wir also Autos und Motorräder. Diese haben alle einen Motor und Räder. Wir möchten aber noch nicht weiter erläutern, wie viele Räder diese haben.

Also erstellen wir uns eine Klasse, die den Grundtypen zusammenfasst.

Klasse Vehicle  
PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php
class Vehicle
{
    protected $engine = "";
    protected $speed = 0;
    protected $tireCount = 0;
    protected $seatCount = 0;

    // ...
    // Funktionen wie getSpeed, setSpeed, getTireCount und setTireCount ...
    // ...
}
?>

Nun erstellen wir die Klassen für Autos und Motorräder, die genauer beschreiben, welche Eigenschaften ein Auto beziehungsweise ein Motorrad hat.

Klasse Car und Motorbike  
PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php
class Car extends Vehicle
{
    protected $tireCount = 4;
    protected $seatCount = 5;
}

class Motorbike extends Vehicle
{
    protected $tireCount = 2;
    protected $seatCount = 2; // Meist können zwei Personen auf dem langen Sitz sitzen ;)
}
?>

Nun können wir unsere weiteren Klassen wie VW, Audi und Mercedes oder auch Yamaha für Motorräder erstellen. Das tolle ist: Wenn wir neue Funktionalitäten hinzufügen wollen, müssen wir dies nur einmal in der Klasse Vehicle tun, und sie sind automatisch in allen Klassen verfügbar, die sich von Vehicle ableiten.

Schlusswort

Ich denke, ihr merkt schon, wie die Klassenvererbung in der objektorientierten Programmierung euch eine Menge Arbeit abnehmen kann. Vielleicht hat euch dieser Artikel ja auch zum Nachdenken angeregt oder euch eventuell Hinweise gegeben, wie ihr euren PHP Code im aktuellen Projekt verbessern könnt.


Wikiseite bearbeiten

Diese Seite kann von jedem registrierten Benutzer bearbeitet werden. Bisher hat 1 Person an der Seite "Vererbung von Klassen mit PHP" mitgewirkt.

Sie haben einen Fehler entdeckt oder möchten etwas ergänzen? Dann können Sie nach der Anmeldung "Vererbung von Klassen mit PHP" hier bearbeiten.

Mitarbeiter
  • Sebastian Hoitz ist Projektleiter der Komola Gruppe. Die Projekte von Komola werden mit PHP 5, MySQL 5, xHTML, CSS sowie AJAX umgesetzt. Desweiteren vertreibt er die deutsche Version der beliebten PHP IDE VS.Php.