OOP Mastery (POO)
Thème :
Junior
1 vues ·2/17 leçonsHéritage VS Composition
Deux façons fondamentales de réutiliser le code et de construire des relations entre les classes.
L’Héritage (Relation EST-UN)
<?php
class Animal {
protected string $name;
public function __construct(string $name) {
$this->name = $name;
}
public function speak(): string {
return 'Un son quelconque';
}
}
class Dog extends Animal {
public function speak(): string {
return 'Wouf !';
}
public function fetch(): void {
echo "{$this->name} va chercher !";
}
}
$dog = new Dog('Rex');
echo $dog->speak(); // Wouf !
$dog->fetch(); // Rex va chercher !
Les Problèmes de l’Héritage Profond
<?php
// Le problème de la classe de base fragile
class Vehicle {
public function start(): void { /* ... */ }
public function stop(): void { /* ... */ }
}
class Car extends Vehicle {
public function honk(): void { /* ... */ }
}
class ElectricCar extends Car {
// Les changements dans Vehicle ou Car peuvent casser ceci !
}
// Couplage fort, difficile à tester, peu flexible
La Composition (Relation A-UN)
<?php
// Au lieu de l'héritage, utilisez la composition
class Engine {
public function start(): void {
echo "Moteur démarré\n";
}
public function stop(): void {
echo "Moteur arrêté\n";
}
}
class Car {
public function __construct(
private Engine $engine
) {}
public function start(): void {
$this->engine->start();
}
public function stop(): void {
$this->engine->stop();
}
}
// Facile de changer de moteur !
class ElectricEngine {
public function start(): void {
echo "Moteur électrique en marche\n";
}
public function stop(): void {
echo "Moteur électrique arrêté\n";
}
}
Préférer la Composition à l’Héritage
<?php
// Approche par héritage (rigide)
class Logger {
public function log(string $message): void { /* ... */ }
}
class FileLogger extends Logger {
// Lié à l'implémentation de Logger
}
// Approche par composition (flexible)
interface LoggerInterface {
public function log(string $message): void;
}
class Application {
public function __construct(
private LoggerInterface $logger // Injection de dépendance
) {}
public function doSomething(): void {
$this->logger->log('Faire quelque chose');
}
}
// Peut utiliser n'importe quelle implémentation de LoggerInterface
$app = new Application(new FileLogger());
$app = new Application(new DatabaseLogger());
$app = new Application(new NullLogger()); // Pour les tests
Quand Utiliser Lequel ?
| Utiliser l’Héritage Quand | Utiliser la Composition Quand |
|---|---|
| Vraie relation EST-UN | Relation A-UN ou UTILISE-UN |
| Partager une implémentation | Partager comportement/contrat |
| Polymorphisme de sous-type requis | Flexibilité requise |
| Hiérarchie peu profonde (1-2 niveaux) | Hiérarchies profondes |
| Points d’extension de framework | Logique métier |
Les Grimoires
📘 Cette leçon fait partie du cours Maîtrise de la POO en PHP sur la plateforme d’apprentissage RostoDev.
Prêt à passer à la suite ?
Vous avez terminé cette leçon sur Héritage VS Composition. Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.