PHP поддерживает определение абстрактных классов и методов. На основе абстрактного класса нельзя создавать объекты, и любой класс, содержащий хотя бы один абстрактный метод, должен быть определён как абстрактный. Методы, объявленные абстрактными, несут, по существу, лишь описательный смысл и не могут включать реализацию. (1)
При наследовании от абстрактного класса, все методы, помеченные абстрактными в родительском классе, должны быть определены в дочернем классе и следовать обычным правилам наследования и совместимости сигнатуры.
Пример #1 Пример абстрактного класса
<?php
abstract class AbstractClass
{
/* Данный метод должен быть определён в дочернем классе */
abstract protected function getValue();
abstract protected function prefixValue($prefix);
/* Общий метод */
public function printOut() {
print $this->getValue() . "n";
}
}
class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}
class ConcreteClass2 extends AbstractClass
{
public function getValue() {
return "ConcreteClass2";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass2";
}
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."n";
$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') ."n";
?>
Результат выполнения данного примера:
ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2
Пример #2 Пример абстрактного класса
<?php
abstract class AbstractClass
{
// Наш абстрактный метод требует только определить необходимые аргументы
abstract protected function prefixName($name);
}
class ConcreteClass extends AbstractClass
{
// Наш дочерний класс может определить необязательные аргументы, не указанные в объявлении родительского метода
public function prefixName($name, $separator = ".") {
if ($name == "Pacman") {
$prefix = "Mr";
} elseif ($name == "Pacwoman") {
$prefix = "Mrs";
} else {
$prefix = "";
}
return "{$prefix}{$separator} {$name}";
}
}
$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "n";
echo $class->prefixName("Pacwoman"), "n";
?>
Результат выполнения данного примера:
Mr. Pacman
Mrs. Pacwoman
Источники:
(1) https://www.php.net/manual/ru/language.oop5.abstract.php
Нет Ответов