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");
?>
Попробуйте сами »