Accueil / Blog / Loi de Demeter en PHP : principe, exemples et bonnes pratiques

Loi de Demeter en PHP : principe, exemples et bonnes pratiques

Loi de Demeter en PHP : écrire un code qui parle moins… mais mieux

Dans le développement logiciel, on entend souvent parler de bonnes pratiques : découplage, séparation des responsabilités, principes SOLID… Mais il en existe une, parfois oubliée, qui mérite toute notre attention : la loi de Demeter. Aussi appelée “principe du moindre savoir”, elle aide à écrire un code plus robuste, lisible et maintenable.



Qu’est-ce que la loi de Demeter ?

Formulée à la fin des années 80 au MIT, la loi de Demeter repose sur une idée simple :

“Un objet ne doit parler qu’à ses amis proches, pas aux amis de ses amis.”

En d’autres termes, une classe doit limiter sa connaissance du système. Elle ne devrait interagir qu’avec :

  • elle-même (ses propres méthodes),
  • ses attributs directs,
  • ses paramètres de méthode,
  • les objets qu’elle crée,
  • et éventuellement des objets globaux (comme des singletons, mais c’est à éviter).

L’objectif est d’éviter un code trop dépendant de la structure interne d’autres objets.


Exemple de violation de la loi de Demeter

Prenons un exemple classique :

$city = $order->getCustomer()->getAddress()->getCity();

Ici, pour obtenir la ville d’un client, l’objet Order doit exposer son Customer, qui expose son Address, qui expose sa City.

On voit apparaître ce qu’on appelle le train wreck pattern : un long chaînage d’appels qui montre que l’on connaît beaucoup trop la structure interne de l’objet.

Exemple corrigé

Une meilleure approche consiste à déléguer la responsabilité aux objets concernés :

class Order
{
    private Customer $customer;

    public function getCustomerCity(): string
    {
        return $this->customer->getCity();
    }
}

Puis côté utilisation :

$city = $order->getCustomerCity();

Ainsi, l’objet Order devient responsable de la façon dont on accède à l’information.
Si demain la structure interne du Customer change (par exemple si l’adresse n’est plus directement liée à l’objet Customer), le code appelant ne sera pas impacté.

Les avantages concrets

Respecter la loi de Demeter apporte plusieurs bénéfices immédiats :

  • Robustesse : un changement interne n’impacte pas le code appelant.
  • Encapsulation : les objets cachent leurs détails internes.
  • Lisibilité : moins de chaînages, un code qui exprime directement ce qu’on veut obtenir.
  • Testabilité : il est plus facile de tester une méthode simple que de simuler un long parcours d’objets.


Conclusion

La loi de Demeter est une règle simple mais puissante : “ne parlez qu’à vos amis proches”.
En évitant les appels chaînés excessifs et en déléguant les responsabilités aux bons objets, vous obtenez un code :

  • plus clair,
  • plus robuste,
  • et plus facile à maintenir.

Prenez un moment pour relire votre code : combien de -> successifs y trouvez-vous ?
C’est peut-être le signe qu’il est temps d’appliquer la loi de Demeter.

Et vous ?

Connaissiez-vous les traits en PHP ? Partagez vos retours ou astuces en me rejoignant sur LinkedIn — je serai ravi d’en discuter !


Encore un peu de lecture ?

Les Traits en PHP, un outil puissant trop peu utilisé ?

Découvrez les Traits en PHP, un excellent outil pour structurer du code partagé.

Lire la suite