Что такое ключевое слово extends в PHP?

Ответ

Ключевое слово 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 работает и для интерфейсов, когда один интерфейс наследует другой. Но это уже другая история, про абстрактные договорённости.