PHP - Абстрактные классы и методы
Абстрактный класс — это класс, который содержит по крайней мере один абстрактный метод. Абстрактный метод — это метод, который объявлен, но не реализован в абстрактном классе. Реализация должна быть выполнена в дочернем классе (или классах).
Цель абстрактного класса — заставить все производные классы (дочерние классы) реализовать абстрактный метод(ы), объявленный в родительском классе.
Абстрактный класс или метод определяется с помощью ключевого слова
abstract.
Давайте рассмотрим пример:
Пример
<?php
// Абстрактный базовый класс
abstract class Car {
public
$name;
// Неабстрактный метод
public
function __construct($name) {
$this->name = $name;
}
// Абстрактный метод - заставляет дочерние классы реализовать его
abstract public function intro();
}
// Дочерний класс, расширяющий абстрактный класс
class
Audi extends Car {
public
function intro() {
return "Немецкое качество! Я $this->name!";
}
}
// Дочерний класс, расширяющий абстрактный класс
class
Citroen extends Car {
public
function intro() {
return "Французская экстравагантность! Я $this->name!";
}
}
// Создаем объекты дочерних классов
$audi = new
audi("Audi");
echo $audi->intro();
echo "<br>";
$citroen = new citroen("Citroen");
echo $citroen->intro();
?>
Попробуйте сами »
Пояснение к примеру
Классы Audi и Citroen наследуются от абстрактного класса Car. Это означает, что классы Audi и Citroen могут использовать публичное свойство $name, а также публичный метод __construct() из класса Car благодаря наследованию.
Кроме того, intro() — это абстрактный метод, который должен быть реализован во всех дочерних классах.
Примечания по абстрактным классам
При наследовании от абстрактного класса метод дочернего класса должен быть определен с тем же именем и тем же или менее ограниченным модификатором доступа. Таким образом, если абстрактный метод определен как protected, метод дочернего класса должен быть определен как protected или public, но не private. Кроме того, тип и количество обязательных аргументов должны быть одинаковыми. Однако дочерние классы могут иметь дополнительные необязательные аргументы.
Таким образом, когда дочерний класс наследуется от абстрактного класса, мы имеем следующие правила:
- Метод дочернего класса должен быть определен с тем же именем и переопределяет родительский абстрактный метод
- Метод дочернего класса должен быть определен с тем же или менее ограниченным модификатором доступа
- Количество обязательных аргументов должно быть одинаковым. Однако дочерний класс может иметь дополнительные необязательные аргументы
PHP - Абстрактный метод с аргументом
Давайте рассмотрим другой пример, где абстрактный метод имеет аргумент:
Пример
<?php
abstract class ParentClass {
// Абстрактный метод с аргументом
abstract protected
function prefixName($name);
}
class ChildClass extends ParentClass {
public function prefixName($name) {
if ($name == "Иван Петров") {
$prefix = "Г-н";
} elseif ($name == "Мария Иванова") {
$prefix =
"Г-жа";
} else {
$prefix = "";
}
return
"$prefix $name";
}
}
$class = new ChildClass;
echo $class->prefixName("Иван Петров");
echo "<br>";
echo $class->prefixName("Мария Иванова");
echo "<br>";
echo $class->prefixName("Дмитрий Сидоров");
?>
Попробуйте сами »
В следующем примере дочерний класс имеет два необязательных аргумента, которые не определены в абстрактном методе родителя:
Пример
<?php
abstract class ParentClass {
// Абстрактный метод с аргументом
abstract protected
function prefixName($name);
}
class ChildClass extends ParentClass {
// Дочерний класс может определять необязательные аргументы, которых нет в абстрактном методе родителя
public function prefixName($name, $separator = ".",
$greet = "Уважаемый") {
if ($name == "Иван Петров") {
$prefix = "Г-н";
} elseif ($name == "Мария Иванова") {
$prefix =
"Г-жа";
} else {
$prefix = "";
}
return
"$greet $prefix$separator $name";
}
}
$class = new ChildClass;
echo $class->prefixName("Иван Петров");
echo "<br>";
echo $class->prefixName("Мария Иванова");
?>
Попробуйте сами »