Class Abstraction
Оновлено: 11.05.2023
У PHP є абстрактні класи та методи. Класи, визначені як абстрактні, не можуть бути екземплярами, і будь-який клас, що містить хоча б один абстрактний метод, також повинен бути абстрактним. Методи, визначені як абстрактні, просто оголошують сигнатуру методу; вони не можуть визначати реалізацію.
При успадкуванні від абстрактного класу всі методи, позначені як абстрактні в оголошенні батьківського класу, повинні бути визначені в дочірньому класі і відповідати звичайним правилам сумісності успадкування та сигнатур.
Приклад #1 Приклад абстрактного класу
<?php
abstract class AbstractClass
{
// Force Extending class to define this method
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// Common method
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";
?>
Приклад #2 Приклад абстрактного класу
<?php
abstract class AbstractClass
{
// Our abstract method only needs to define the required arguments
abstract protected function prefixName($name);
}
class ConcreteClass extends AbstractClass
{
// Our child class may define optional arguments not in the parent's signature
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";
?>