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; }.