class Animal {
public function __construct(protected string $name) {}
public function speak(): string { return '...'; }
}
class Dog extends Animal {
public function speak(): string { return 'Woof!'; }
public function fetch(): void { /* ... */ }
}
$d = new Dog('Rex');
$d->speak(); // "Woof!" — overriding
$d->fetch(); // собственный метод
Наследование часто избыточно. Вопрос: «является ли B разновидностью A?» (is-a). Если да — ок. Если вы наследуете только ради повторного использования кода — лучше Composition или Trait.
Встраивание объектов вместо наследования — более гибко. Вместо class EmailService extends Mailer → class EmailService { private Mailer $mailer; }.