PHP OOP - Abstracte lessen
PHP - Wat zijn abstracte klassen en methoden?
Abstracte klassen en methoden zijn wanneer de bovenliggende klasse een benoemde methode heeft, maar de onderliggende klasse(n) nodig heeft om de taken uit te voeren.
Een abstracte klasse is een klasse die ten minste één abstracte methode bevat. Een abstracte methode is een methode die is gedeclareerd, maar niet geïmplementeerd in de code.
Een abstracte klasse of methode wordt gedefinieerd met het abstract
sleutelwoord:
Syntaxis
<?php
abstract class
ParentClass {
abstract public function someMethod1();
abstract public function someMethod2($name, $color);
abstract
public function someMethod3() : string;
}
?>
Bij het erven van een abstracte klasse, moet de methode van de onderliggende klasse worden gedefinieerd met dezelfde naam en dezelfde of een minder beperkte toegangsmodifier. Dus als de abstracte methode is gedefinieerd als beschermd, moet de methode van de onderliggende klasse worden gedefinieerd als beschermd of openbaar, maar niet als privé. Ook moeten het type en het aantal vereiste argumenten hetzelfde zijn. De onderliggende klassen kunnen echter ook optionele argumenten hebben.
Dus wanneer een onderliggende klasse wordt geërfd van een abstracte klasse, hebben we de volgende regels:
- De methode van de onderliggende klasse moet met dezelfde naam worden gedefinieerd en de bovenliggende abstracte methode wordt opnieuw gedeclareerd
- De methode van de onderliggende klasse moet worden gedefinieerd met dezelfde of een minder beperkte toegangsmodifier
- Het aantal vereiste argumenten moet hetzelfde zijn. De onderliggende klasse kan echter ook optionele argumenten hebben
Laten we een voorbeeld bekijken:
Voorbeeld
<?php
// Parent class
abstract class Car {
public
$name;
public
function __construct($name) {
$this->name = $name;
}
abstract public function intro() : string;
}
// Child classes
class
Audi extends Car {
public
function intro() : string {
return "Choose German
quality! I'm an $this->name!";
}
}
class
Volvo extends Car {
public
function intro() : string {
return "Proud to be
Swedish! I'm a $this->name!";
}
}
class
Citroen extends Car {
public
function intro() : string {
return "French
extravagance! I'm a $this->name!";
}
}
// Create objects from the child classes
$audi = new
audi("Audi");
echo $audi->intro();
echo "<br>";
$volvo = new
volvo("Volvo");
echo $volvo->intro();
echo "<br>";
$citroen = new citroen("Citroen");
echo $citroen->intro();
?>
Voorbeeld uitgelegd
De klassen Audi, Volvo en Citroën zijn overgenomen van de autoklasse. Dit betekent dat de klassen Audi, Volvo en Citroen vanwege overerving zowel de eigenschap public $name als de methode public __construct() uit de klasse Car kunnen gebruiken.
Maar intro() is een abstracte methode die in alle onderliggende klassen moet worden gedefinieerd en ze moeten een tekenreeks retourneren.
PHP - Meer abstracte klassenvoorbeelden
Laten we een ander voorbeeld bekijken waarin de abstracte methode een argument heeft:
Voorbeeld
<?php
abstract class ParentClass {
// Abstract method
with an argument
abstract protected
function prefixName($name);
}
class ChildClass extends ParentClass {
public function prefixName($name) {
if ($name == "John Doe") {
$prefix = "Mr.";
} elseif ($name == "Jane Doe") {
$prefix =
"Mrs.";
} else {
$prefix = "";
}
return
"{$prefix} {$name}";
}
}
$class = new ChildClass;
echo $class->prefixName("John
Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?>
Laten we een ander voorbeeld bekijken waarin de abstracte methode een argument heeft en de onderliggende klasse twee optionele argumenten heeft die niet zijn gedefinieerd in de abstracte methode van de bovenliggende categorie:
Voorbeeld
<?php
abstract class ParentClass {
// Abstract method
with an argument
abstract protected
function prefixName($name);
}
class ChildClass extends ParentClass {
// The child class may define optional arguments that are not in the parent's
abstract method
public function prefixName($name, $separator = ".",
$greet = "Dear") {
if ($name == "John Doe") {
$prefix = "Mr";
} elseif ($name == "Jane Doe") {
$prefix =
"Mrs";
} else {
$prefix = "";
}
return
"{$greet} {$prefix}{$separator} {$name}";
}
}
$class = new ChildClass;
echo $class->prefixName("John
Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?>