PHP ООП - Абстрактні класи
PHP - Що таке абстрактні класи та методи?
Абстрактні класи та методи — це коли батьківський клас має іменований метод, але потребує дочірніх класів для виконання завдань.
Абстрактний клас — це клас, який містить принаймні один абстрактний метод. Абстрактний метод – це метод, який оголошено, але не реалізовано в коді.
Абстрактний клас або метод визначається за допомогою ключового слова abstract
:
Синтаксис
<?php
abstract class ParentClass {
abstract public function someMethod1();
abstract public function someMethod2($name, $color);
abstract public function someMethod3() : string;
}
?>
При успадкуванні від абстрактного класу метод дочірнього класу повинен бути визначений з таким же ім’ям і тим самим або менш обмеженим модифікатором доступу. Отже, якщо абстрактний метод визначено як захищений, метод дочірнього класу має бути визначений як захищений або публічний, але не приватний. Крім того, тип і кількість необхідних аргументів повинні бути однаковими. Однак дочірні класи можуть додатково мати додаткові аргументи.
Отже, коли дочірній клас успадковується від абстрактного класу, ми маємо такі правила:
- Метод дочірнього класу має бути визначено з тим самим іменем, і він повторно оголошує батьківський абстрактний метод
- Метод дочірнього класу має бути визначений з таким самим або менш обмеженим модифікатором доступу
- Кількість необхідних аргументів має бути однаковою. Проте дочірній клас може мати додаткові аргументи
Розгляньмо приклад:
Приклад
<?php
// Батьківський клас
abstract class Car {
public $name;
public function __construct($name) {
$this->name = $name;
}
abstract public function intro() : string;
}
// Дочірні класи
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!";
}
}
// Створити об’єкти з дочірніх класів
$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();
?>
Спробуйте самі »
Пояснення прикладу
Класи Audi, Volvo та Citroen успадковані від класу Car. Це означає, що класи Audi, Volvo та Citroen можуть використовувати публічну властивість $name, а також публічний метод __construct() із класу Car через успадкування.
Але intro() — це абстрактний метод, який має бути визначений у всіх дочірніх класах, і вони мають повертати рядок.
PHP - Більше прикладів абстрактних класів
Давайте розглянемо інший приклад, де абстрактний метод має аргумент:
Приклад
<?php
abstract class ParentClass {
// Абстрактний метод з аргументом
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");
?>
Спробуйте самі »
Давайте розглянемо інший приклад, де абстрактний метод має аргумент, а дочірній клас має два необов’язкові аргументи, які не визначені в абстрактному батьківському методі:
Приклад
<?php
abstract class ParentClass {
// Абстрактний метод з аргументом
abstract protected function prefixName($name);
}
class ChildClass extends ParentClass {
// Дочірній клас може визначати додаткові аргументи, яких немає в батьківському абстрактному методі
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");
?>
Спробуйте самі »