PHP OOP - Abstraktní třídy
PHP – Co jsou abstraktní třídy a metody?
Abstraktní třídy a metody jsou, když nadřazená třída má pojmenovanou metodu, ale potřebuje její podřízené třídy k plnění úkolů.
Abstraktní třída je třída, která obsahuje alespoň jednu abstraktní metodu. Abstraktní metoda je metoda, která je deklarována, ale není implementována v kódu.
Abstraktní třída nebo metoda je definována pomocí abstract
klíčového slova:
Syntax
<?php
abstract class
ParentClass {
abstract public function someMethod1();
abstract public function someMethod2($name, $color);
abstract
public function someMethod3() : string;
}
?>
Při dědění z abstraktní třídy musí být metoda podřízené třídy definována se stejným názvem a se stejným nebo méně omezeným modifikátorem přístupu. Pokud je tedy abstraktní metoda definována jako chráněná, metoda podřízené třídy musí být definována jako chráněná nebo veřejná, ale ne soukromá. Také typ a počet požadovaných argumentů musí být stejný. Podřízené třídy však mohou mít navíc volitelné argumenty.
Když je tedy podřízená třída zděděna z abstraktní třídy, máme následující pravidla:
- Metoda podřízené třídy musí být definována se stejným názvem a znovu deklaruje nadřazenou abstraktní metodu
- Metoda podřízené třídy musí být definována se stejným nebo méně omezeným modifikátorem přístupu
- Počet požadovaných argumentů musí být stejný. Podřízená třída však může mít navíc volitelné argumenty
Podívejme se na příklad:
Příklad
<?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();
?>
Příklad vysvětlen
Třídy Audi, Volvo a Citroen jsou zděděny z třídy Car. To znamená, že třídy Audi, Volvo a Citroen mohou používat veřejnou vlastnost $name a také metodu public __construct() z třídy Car z důvodu dědičnosti.
Ale intro() je abstraktní metoda, která by měla být definována ve všech podřízených třídách a ty by měly vracet řetězec.
PHP - Další příklady abstraktní třídy
Podívejme se na další příklad, kde má abstraktní metoda argument:
Příklad
<?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");
?>
Podívejme se na další příklad, kde abstraktní metoda má argument a podřízená třída má dva volitelné argumenty, které nejsou definovány v rodičovské abstraktní metodě:
Příklad
<?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");
?>