Ответ
Ключевое слово extends используется в PHP для реализации наследования — механизма ООП, при котором один класс (дочерний, наследник) может унаследовать свойства и методы другого класса (родительского, базового). PHP поддерживает одиночное наследование (класс может наследовать только от одного родителя).
Основные принципы:
- Дочерний класс получает все public и protected методы и свойства родительского класса.
- Дочерний класс может переопределить (override) унаследованные методы, предоставив свою собственную реализацию.
- Для доступа к переопределённому методу или свойству родителя используется оператор
parent::.
Пример базового наследования:
class Vehicle
{
protected string $brand;
public function __construct(string $brand)
{
$this->brand = $brand;
}
public function getInfo(): string
{
return "Brand: {$this->brand}";
}
}
class Car extends Vehicle
{
private int $doors;
public function __construct(string $brand, int $doors)
{
// Вызов конструктора родительского класса
parent::__construct($brand);
$this->doors = $doors;
}
// Переопределение метода родителя с расширением функциональности
public function getInfo(): string
{
$baseInfo = parent::getInfo();
return $baseInfo . ", Doors: {$this->doors}";
}
}
$myCar = new Car('Toyota', 4);
echo $myCar->getInfo(); // Brand: Toyota, Doors: 4
Важные ограничения:
- Если класс или метод объявлен с модификатором
final, его нельзя наследовать или переопределять. - Ключевое слово
extendsтакже используется для наследования интерфейсов друг от друга.
Ответ 18+ 🔞
А, ну это же классика, про которую все слышали, но половина нихуя не понимает! Смотри, extends — это как будто ты родил ребёнка, и он автоматически получает твою фамилию, квартиру и долги по ипотеке, но при этом может сам решать, как этой квартирой распоряжаться. В мире PHP это называется наследованием. Один класс (ребёнок, наследник) может унаследовать всё барахло (свойства и методы) от другого класса (родителя). Главное правило — ребёнок может быть только один, овердохуища наследников PHP не разрешает, это одиночное наследование.
Что тут происходит, по сути:
- Дочерний класс хавает все public и protected методы и свойства родителя. Private — это как семейный сейф, туда уже не пускают.
- Если наследнику не нравится, как папаша что-то делает, он может это переопределить (override) — сделать по-своему, молодой и дерзкий.
- Чтобы в переопределённом методе всё же позвать старика на помощь и взять у него какую-то логику, используется волшебное слово
parent::.
Смотри, как это выглядит в жизни, на примере:
class Vehicle
{
protected string $brand;
public function __construct(string $brand)
{
$this->brand = $brand;
}
public function getInfo(): string
{
return "Brand: {$this->brand}";
}
}
// Вот тут самое интересное! Класс Car говорит: "Я наследую всё от Vehicle, ёпта!"
class Car extends Vehicle
{
private int $doors;
public function __construct(string $brand, int $doors)
{
// Сначала кричим папе: "Пап, инициализируй бренд, как ты это умеешь!"
parent::__construct($brand);
// А потом уже делаем свои дела — двери считаем.
$this->doors = $doors;
}
// А вот тут мы папин метод переписываем под себя. "Я сделаю круче!"
public function getInfo(): string
{
$baseInfo = parent::getInfo(); // Но сначала спросим у папы базовую инфу.
return $baseInfo . ", Doors: {$this->doors}"; // И прикрутим своё.
}
}
$myCar = new Car('Toyota', 4);
echo $myCar->getInfo(); // Выведет: Brand: Toyota, Doors: 4
Но есть, блядь, и подводные камни, куда без них:
- Если класс или метод помечен словом
final— это как будто на двери висит огромный амбарный замок. Наследовать или переопределять это — нихуя не получится, терпения ноль ебать. - Это же ключевое слово
extendsработает и для интерфейсов, когда один интерфейс наследует другой. Но это уже другая история, про абстрактные договорённости.