OOP PHP5 - Grundlagen - Vererbung - Wichtige Hinweise
1. Weitere Zugriffsrechte
Der Zugriff auf Methoden und Eigenschaften ist bei abgeleiteten Klassen keine Einbahnstraße. Nein, es ist völlig egal, ob zum Beispiel
eine Großelternklasse auf Eigenschaften einer Enkelklasse zugreifen möchte. Oder ob eine Elternklasse die Methode einer Kindklasse
benötigt. Es ist alles möglich, so lange man nicht mit private
arbeitet.
Ein Beispiel
Schauen wir uns nun mal Dieters Hund ein wenig genauer an. Und konzentrieren uns auf die Anzahl seiner Beine. Gut, ist ein auf den ersten
Blick saublödes Beispiel. Aber! Wir arbeiten ja mit einer Klasse Saeugetier
. Und da spielt das unter Umständen schon eine
Rolle, da es bekanntermaßen mehrere Möglichkeiten gibt. Das könnte dann so aussehen.
class Saeugetier
{
protected function getLegsNum()
{
echo $this -> legs;
}
}
class Hund extends Saeugetier
{
protected $legs = 4;
}
class Ruede extends Hund
{
public function countLegs()
{
$this -> getLegsNum();
}
}
$waldi = new Ruede;
$waldi -> countLegs();
Erläuterung
Hunde haben für gewöhnlich vier Beine. Also wurde diese Eigenschaft in der Klasse Hund
definiert. Wenn man aber mit
verschiedenen Säugetieren zu tun hat, so baut man in der entsprechenden Klasse eine Methode ein, die die Anzahl zurückgibt. Jetzt möchte
aber die Objektreferenz $waldi
darüber etwas in Erfahrung bringen.
Dazu greift es auf die öffentliche Methode countLegs
der Klasse Ruede
zu. Die ruft dann die Methode
getLegsNum
der Großelternklasse Saeugetier
auf. Und die holt sich dann den Wert aus deren Kindklasse
Hund
. Gut, man hätte hier korrekterweise mit return
arbeiten sollen. Außerdem gehört die Methode
countLegs
genau genommen in die Klasse Hund
. Allerdings geht es nur um's Prinzip und ich hoffe, das ist jetzt
klar.
2. Namensvergabe
Passt um Gottes willen höllisch auf, wenn es um die Bezeichnung von Methoden geht. Denn da könnt ihr böse auf die Fresse fallen. Dazu
ein einfaches Beispiel. Wir haben in der Klasse Mensch
eine Methode setName
, um einem Objekt einen Namen zu geben.
class Mensch
{
protected $name;
protected function setName($value)
{
$this -> name = $value;
}
}
Jetzt wollen wir diese Methode in der Kindklasse Frau
aufrufen. Aus lauter Faulheit wählen wir dort aber einen identischen
Methodennamen.
class Frau extends Mensch
{
public function setName($value)
{
$this -> setName($value);
}
}
$doerte = new Frau;
$doerte -> setName('Dörte');
Und an der Stelle knallt es. Aber gewaltig! Warum? Ganz einfach, weil die Methode setName
in der Klasse Frau
immer wieder auf sich selbst zugreift. Und das ist eine Art von Endlosschleife, die vom Webserver irgendwann quittiert wird. Eigentlich
wäre dieser Hinweis überflüssig, wenn ich diesen Fehler nicht schon oft genug gesehen hätte. Ach ja, hierfür gibt es eine Lösung, aber dazu
komme ich später.
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt