Vererbung und Sichtbarkeiten
Erste Schritte: Vererbung und Sichtbarkeiten: public, protected, private
In der objektorientierten PHP‑Welt ermöglicht Vererbung,
dass eine Klasse (Kind‑Klasse) Eigenschaften & Methoden einer anderen Klasse (Eltern‑Klasse) übernimmt.
Gemeinsam mit den Sichtbarkeiten public, protected und private
legst du fest, welche Teile nach außen sichtbar sind und welche intern bleiben.
Dieses Tutorial zeigt dir, wie beides zusammenspielt.
1. Grundlagen der Vererbung
Mit extends deklarierst du, dass eine Klasse von einer anderen erbt.
class Tier { public function geraeusch() { return "macht Geräusch"; } } class Hund extends Tier { public function geraeusch() { return "Wuff!"; } }
- Hund erbt automatisch alles aus Tier.
- Überschreibt Hund eine Methode (gleicher Name & Signatur),
spricht man von Override – PHP nutzt die Kind‑Version.
1.1 parent:: aufrufen
Willst du innerhalb der Kind‑Methode den Eltern‑Code zusätzlich ausführen,
greifst du auf parent:: zu:
class Katze extends Tier { public function geraeusch() { return parent::geraeusch() . " und Miau!"; } }
2. Sichtbarkeiten: public, protected, private
Stufe | Zugriff innerhalb der Klasse |
in Kind‑Klassen | von außen |
---|---|---|---|
public | ja | ja | ja |
protected | ja | ja | nein |
private | ja | nein | nein |
- public – überall erreichbar (API deiner Klasse).
- protected – nur intern & in abgeleiteten Klassen.
- private – strikt innerhalb der Klasse, nicht vererbbar.
2.1 Beispiel mit Eigenschaftsichtbarkeit
class Konto { public $inhaber; // offen für alle protected $saldo = 0; // nur Konto + Kind‑Klassen private $pin; // nur Konto selbst public function __construct($inhaber, $pin) { $this->inhaber = $inhaber; $this->pin = $pin; } public function einzahlen($betrag) { $this->saldo += $betrag; } protected function internSaldo() { return $this->saldo; // OK: protected innerhalb der Klasse } } class Sparkonto extends Konto { public function zeigeSaldo() { // $this->saldo ist erreichbar (protected) return $this->internSaldo(); } } $k = new Sparkonto("Lisa", 1234); $k->einzahlen(100); // echo $k->saldo; // Fehler: protected echo $k->zeigeSaldo(); // 100
3. Konstruktor & Vererbung
In Kind‑Klassen kannst (oder musst) du den Eltern‑Konstruktor aufrufen:
class Person { protected $name; public function __construct($name) { $this->name = $name; } } class Mitarbeiter extends Person { private $abteilung; public function __construct($name, $abteilung) { parent::__construct($name); // Elternkonstruktor $this->abteilung = $abteilung; } }
4. final & abstract
- final class – verbietet Vererbung.
- final function – Methode darf in Kind‑Klasse nicht überschrieben werden.
- abstract class – enthält unvollständige (abstract‑)Methoden;
kann nicht direkt instanziiert werden.
abstract class Fahrzeug { abstract public function starteMotor(); } class Motorrad extends Fahrzeug { public function starteMotor() { return "Motor startet ..."; } }
5. Best Practices
- Expose nur, was wirklich extern gebraucht wird (public sparsam nutzen).
- Implementiere Wiederverwendbares in Eltern‑Klasse; Spezialfälle in Kind‑Klassen.
- Nutze protected statt private, wenn Kind‑Klassen Zugriff benötigen.
- Für unveränderliche Methoden final setzen (z. B. Sicherheits‑Logik).
- Verwende abstract für „Schablonen“ mit Pflicht‑Methoden.
Fazit
Mit Vererbung organisierst du gemeinsam genutzte Logik in Eltern‑Klassen,
während spezialisierte Funktionalität in Kind‑Klassen lebt.
Die Sichtbarkeiten public, protected und private
regeln, wer auf welche Members zugreifen darf.
Durch einen überlegten Einsatz von Vererbung, Sichtbarkeit und Schlüsselwörtern wie final
und abstract schreibst du flexiblen, wartbaren und sicher gekapselten OOP‑Code in PHP.