PHP OOP - Vererbung
PHP - Was ist Vererbung?
Vererbung in OOP = Wenn eine Klasse von einer anderen Klasse abgeleitet ist.
Die untergeordnete Klasse erbt alle öffentlichen und geschützten Eigenschaften und Methoden von der übergeordneten Klasse. Darüber hinaus kann es eigene Eigenschaften und Methoden haben.
Eine geerbte Klasse wird mit dem extends
Schlüsselwort definiert.
Schauen wir uns ein Beispiel an:
Beispiel
<?php
class Fruit {
public
$name;
public $color;
public
function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
public function intro() {
echo "The fruit is {$this->name}
and the color is {$this->color}.";
}
}
// Strawberry is inherited from Fruit
class
Strawberry extends Fruit {
public
function message() {
echo "Am I a fruit or a
berry? ";
}
}
$strawberry = new Strawberry("Strawberry", "red");
$strawberry->message();
$strawberry->intro();
?>
Beispiel erklärt
Die Strawberry-Klasse wird von der Fruit-Klasse geerbt.
Das bedeutet, dass die Strawberry-Klasse aufgrund der Vererbung die öffentlichen $name- und $color-Eigenschaften sowie die öffentlichen __construct()- und intro()-Methoden der Fruit-Klasse verwenden kann.
Die Strawberry-Klasse hat auch ihre eigene Methode: message().
PHP - Vererbung und der Protected Access Modifier
Im vorherigen Kapitel haben wir gelernt, dass protected
auf Eigenschaften oder Methoden innerhalb der Klasse und von Klassen, die von dieser Klasse abgeleitet sind, zugegriffen werden kann. Was bedeutet das?
Schauen wir uns ein Beispiel an:
Beispiel
<?php
class Fruit {
public
$name;
public $color;
public
function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
protected function intro() {
echo "The fruit is {$this->name}
and the color is {$this->color}.";
}
}
class
Strawberry extends Fruit {
public
function message() {
echo "Am I a fruit or a
berry? ";
}
}
// Try to call all three methods from outside class
$strawberry = new Strawberry("Strawberry", "red");
// OK. __construct() is public
$strawberry->message(); // OK. message()
is public
$strawberry->intro(); // ERROR. intro()
is protected
?>
Im obigen Beispiel sehen wir, dass wir einen Fehler erhalten, wenn wir versuchen, eine protected
Methode (intro()) von außerhalb der Klasse aufzurufen. public
Methoden werden gut funktionieren!
Schauen wir uns ein anderes Beispiel an:
Beispiel
<?php
class Fruit {
public $name;
public
$color;
public function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
protected function intro() {
echo "The
fruit is {$this->name} and the color is {$this->color}.";
}
}
class Strawberry extends Fruit {
public function message() {
echo "Am I a fruit or a berry? ";
// Call protected
method from within derived class - OK
$this ->
intro();
}
}
$strawberry = new Strawberry("Strawberry", "red"); // OK. __construct() is
public
$strawberry->message(); // OK. message() is
public and it calls intro() (which is protected) from within the
derived class
?>
Im obigen Beispiel sehen wir, dass alles gut funktioniert! Das liegt daran, dass wir die
protected
Methode (intro()) innerhalb der abgeleiteten Klasse aufrufen.
PHP - Überschreiben geerbter Methoden
Geerbte Methoden können überschrieben werden, indem die Methoden (mit demselben Namen) in der untergeordneten Klasse neu definiert werden.
Sehen Sie sich das Beispiel unten an. Die Methoden __construct() und intro() in der untergeordneten Klasse (Strawberry) überschreiben die Methoden __construct() und intro() in der übergeordneten Klasse (Fruit):
Beispiel
<?php
class Fruit {
public
$name;
public $color;
public
function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
public function intro() {
echo "The fruit is {$this->name}
and the color is {$this->color}.";
}
}
class
Strawberry extends Fruit {
public $weight;
public
function __construct($name, $color, $weight) {
$this->name = $name;
$this->color = $color;
$this->weight = $weight;
}
public function intro() {
echo "The fruit is {$this->name}, the color is {$this->color},
and the weight is {$this->weight} gram.";
}
}
$strawberry = new Strawberry("Strawberry", "red",
50);
$strawberry->intro();
?>
PHP - Das letzte Schlüsselwort
Das final
Schlüsselwort kann verwendet werden, um die Klassenvererbung oder das Überschreiben von Methoden zu verhindern.
Das folgende Beispiel zeigt, wie Sie die Klassenvererbung verhindern:
Beispiel
<?php
final class Fruit {
// some code
}
//
will result in error
class
Strawberry extends Fruit {
// some code
}
?>
Das folgende Beispiel zeigt, wie das Überschreiben von Methoden verhindert wird:
Beispiel
<?php
class Fruit {
final public function intro() {
// some code
}
}
class
Strawberry extends Fruit {
//
will result in error
public function intro() {
// some code
}
}
?>