Интерфейс и абстрактный класс — это два способа реализации абстракции в объектно-ориентированном программировании, но у них есть ключевые отличия:
В PHP интерфейсы и абстрактные классы используются для определения структуры классов, но они имеют разные цели и ограничения.
Может содержать как абстрактные методы (без реализации), так и методы с реализацией.
// Интерфейс
interface Shape {
public function area();
}
// Абстрактный класс
abstract class Polygon {
protected $sides;
public function __construct($sides) {
$this->sides = $sides;
}
abstract public function perimeter();
}
// Класс, реализующий интерфейс и наследующий абстрактный класс
class Rectangle extends Polygon implements Shape {
private $width;
private $height;
public function __construct($width, $height) {
parent::__construct(4); // У прямоугольника 4 стороны
$this->width = $width;
$this->height = $height;
}
public function area() {
return $this->width * $this->height;
}
public function perimeter() {
return 2 * ($this->width + $this->height);
}
}
// Использование
$rectangle = new Rectangle(5, 10);
echo "Area: " . $rectangle->area() . "\n"; // Area: 50
echo "Perimeter: " . $rectangle->perimeter() . "\n"; // Perimeter: 30
?>
Интерфейс Shape определяет метод area(), который должен быть реализован в любом классе, который его использует.
Polygon содержит абстрактный метод perimeter() и может иметь реализацию других методов и свойств.Rectangle реализует интерфейс Shape и наследует абстрактный класс Polygon, предоставляя реализацию как для метода area(), так и для метода perimeter().