PHP OOP - Overerving
PHP - Wat is overerving?
Overerving in OOP = Wanneer een klasse voortkomt uit een andere klasse.
De onderliggende klasse erft alle openbare en beschermde eigenschappen en methoden van de bovenliggende klasse. Bovendien kan het zijn eigen eigenschappen en methoden hebben.
Een overgeërfde klasse wordt gedefinieerd met behulp van het extends
sleutelwoord.
Laten we een voorbeeld bekijken:
Voorbeeld
<?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();
?>
Voorbeeld uitgelegd
De klasse Aardbei is geërfd van de klasse Fruit.
Dit betekent dat de klasse Strawberry vanwege overerving de openbare eigenschappen $name en $color kan gebruiken, evenals de methoden public __construct() en intro() van de klasse Fruit.
De klasse Strawberry heeft ook zijn eigen methode: message().
PHP - Overerving en de Protected Access Modifier
In het vorige hoofdstuk hebben we geleerd dat protected
eigenschappen of methoden toegankelijk zijn binnen de klasse en door klassen die van die klasse zijn afgeleid. Wat betekent dat?
Laten we een voorbeeld bekijken:
Voorbeeld
<?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
?>
In het bovenstaande voorbeeld zien we dat als we een protected
methode (intro()) van buiten de klasse proberen aan te roepen, we een foutmelding krijgen. public
methoden werken prima!
Laten we een ander voorbeeld bekijken:
Voorbeeld
<?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
?>
In bovenstaand voorbeeld zien we dat alles goed werkt! Het is omdat we de
protected
methode (intro()) aanroepen vanuit de afgeleide klasse.
PHP - Overerfde methoden overschrijven
Overerfde methoden kunnen worden overschreven door de methoden opnieuw te definiëren (gebruik dezelfde naam) in de onderliggende klasse.
Kijk naar het voorbeeld hieronder. De methoden __construct() en intro() in de onderliggende klasse (Strawberry) overschrijven de methoden __construct() en intro() in de bovenliggende klasse (Fruit):
Voorbeeld
<?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 - Het laatste trefwoord
Het final
sleutelwoord kan worden gebruikt om klasseovererving te voorkomen of om methodeoverschrijving te voorkomen.
Het volgende voorbeeld laat zien hoe u klasse-overerving kunt voorkomen:
Voorbeeld
<?php
final class Fruit {
// some code
}
//
will result in error
class
Strawberry extends Fruit {
// some code
}
?>
Het volgende voorbeeld laat zien hoe u het overschrijven van methoden kunt voorkomen:
Voorbeeld
<?php
class Fruit {
final public function intro() {
// some code
}
}
class
Strawberry extends Fruit {
//
will result in error
public function intro() {
// some code
}
}
?>