Hauptmenü

Untermenü

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