PHP ООП — абстрактные классы
PHP — что такое абстрактные классы и методы?
Абстрактные классы и методы — это когда родительский класс имеет именованный метод, но нуждается в дочерних классах для выполнения задач.
Абстрактный класс — это класс, который содержит хотя бы один абстрактный метод. Абстрактный метод — это метод, который объявлен, но не реализован в коде.
Абстрактный класс или метод определяется abstract
ключевым словом:
Синтаксис
<?php
abstract class
ParentClass {
abstract public function someMethod1();
abstract public function someMethod2($name, $color);
abstract
public function someMethod3() : string;
}
?>
При наследовании от абстрактного класса метод дочернего класса должен быть определен с тем же именем и тем же или менее ограниченным модификатором доступа. Таким образом, если абстрактный метод определен как защищенный, метод дочернего класса должен быть определен либо как защищенный, либо как общедоступный, но не как частный. Кроме того, тип и количество обязательных аргументов должны быть одинаковыми. Однако дочерние классы могут иметь дополнительные аргументы.
Итак, когда дочерний класс наследуется от абстрактного класса, у нас есть следующие правила:
- Метод дочернего класса должен быть определен с тем же именем, и он переопределяет родительский абстрактный метод.
- Метод дочернего класса должен быть определен с тем же или менее ограниченным модификатором доступа.
- Количество обязательных аргументов должно быть одинаковым. Однако дочерний класс может иметь дополнительные аргументы.
Давайте посмотрим на пример:
Пример
<?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();
?>
Объяснение примера
Классы Audi, Volvo и Citroen наследуются от класса Car. Это означает, что классы Audi, Volvo и Citroen могут использовать общедоступное свойство $name, а также общедоступный метод __construct() класса Car из-за наследования.
Но intro() — это абстрактный метод, который должен быть определен во всех дочерних классах, и они должны возвращать строку.
PHP — дополнительные примеры абстрактных классов
Давайте посмотрим на другой пример, где у абстрактного метода есть аргумент:
Пример
<?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");
?>
Давайте рассмотрим другой пример, где у абстрактного метода есть аргумент, а у дочернего класса есть два необязательных аргумента, которые не определены в абстрактном методе родителя:
Пример
<?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");
?>