Расширение классов с помощью наследования
Используйте extends для построения иерархий классов и переопределения методов
«Расширение классов с помощью наследования» — бесплатный урок PHP Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.
Введение: наследование в PHP
Наследование позволяет классу (потомку) повторно использовать и расширять код другого класса (родителя) с помощью ключевого слова extends. PHP поддерживает одиночное наследование.
Ключевые понятия
Ключевые понятия:
- Потомок наследует все открытые и защищённые члены
- Переопределяйте методы родителя, чтобы изменить поведение
- Вызывайте метод родителя с помощью
parent:: - Используйте
final, чтобы запретить переопределение
Базовое использование extends
Пример:
<?php
class Shape {
public function __construct(protected string $color) {}
public function describe(): string { return "A {$this->color} shape"; }
}
class Circle extends Shape {
public function __construct(string $color, private float $radius) {
parent::__construct($color);
}
public function area(): float { return M_PI * $this->radius ** 2; }
}
$c = new Circle('red', 5);
echo $c->describe(); // A red shape
echo round($c->area()); // 79Переопределение методов
Продолжение:
<?php
class Logger {
public function log(string $msg): void {
echo "[LOG] $msg" . PHP_EOL;
}
}
class DatabaseLogger extends Logger {
public function log(string $msg): void {
// Extend parent behavior
parent::log($msg);
// Also save to DB
echo "[DB] Saved: $msg" . PHP_EOL;
}
}
$l = new DatabaseLogger();
$l->log('User login');Ключевое слово final
Подробнее:
<?php
class PaymentProcessor {
final public function processPayment(float $amount): void {
// Critical logic — cannot be overridden
$this->validate($amount);
$this->charge($amount);
$this->log($amount);
}
protected function validate(float $amount): void { /* ... */ }
protected function charge(float $amount): void { /* ... */ }
protected function log(float $amount): void { /* ... */ }
}Проверка instanceof
Практическое использование:
<?php
class Vehicle {}
class Car extends Vehicle {}
class ElectricCar extends Car {}
$ev = new ElectricCar();
var_dump($ev instanceof ElectricCar); // true
var_dump($ev instanceof Car); // true
var_dump($ev instanceof Vehicle); // true
// Also works with interfaces
var_dump($ev instanceof Countable); // falseАбстрактный базовый класс
Расширенное использование:
<?php
abstract class Notification {
abstract public function send(string $message): bool;
public function sendBatch(array $messages): void {
foreach ($messages as $msg) {
$this->send($msg);
}
}
}
class EmailNotification extends Notification {
public function send(string $message): bool {
echo "Email: $message" . PHP_EOL;
return true;
}
}Шаблон
Распространённые шаблоны наследования в PHP помогают аккуратно решать регулярно возникающие задачи проектирования. Применяйте их последовательно, чтобы код оставался понятным и удобным для сопровождения.
Когда использовать
Знать, когда применять наследование в PHP, так же важно, как знать, как это делать. Чрезмерное использование приводит к усложнению, а недостаточное — к дублированию.
Пример из реального мира
В реальных приложениях наследование в PHP часто встречается во фреймворках, ORM и служебных уровнях. Понимание этой возможности подготовит Вас к участию в профессиональных проектах на PHP.
Распространённые ошибки
Избегайте этих ошибок при работе с наследованием в PHP:
- Всегда вызывайте parent::__construct(), чтобы инициализировать состояние родителя
- Не переопределяйте методы только ради вызова родительского метода без изменений
- Используйте final для методов, критически важных для безопасности
- Отдавайте предпочтение композиции, а не глубоким иерархиям наследования
Быстрая проверка
Какое ключевое слово запрещает переопределение метода в дочернем классе?
Итоги: наследование в PHP
Итоги:
- Всегда вызывайте parent::__construct(), чтобы инициализировать состояние родителя
- Не переопределяйте методы только ради вызова родительского метода без изменений
- Используйте final для методов, критически важных для безопасности
- Отдавайте предпочтение композиции, а не глубоким иерархиям наследования
Часто задаваемые вопросы
Урок «Расширение классов с помощью наследования» бесплатный?
Да — полный текст урока «Расширение классов с помощью наследования» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.
Чему я научусь в уроке «Расширение классов с помощью наследования»?
Используйте extends для построения иерархий классов и переопределения методов Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать PHP Academy?
Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Расширение классов с помощью наследования»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке PHP Academy?
Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Расширение классов с помощью наследования
- Абстрактные классы и методы
- Реализация интерфейсов
- Трейты для повторного использования кода