Apparues avec PHP 5, les classes abtraites (abstract classes) et autres interfaces mettent du temps à s’imposer au sein de la communauté des développeurs PHP. Largement répandues dans les mondes Java et .NET, ces deux notions constituent l’un des fondements de la programmation orientée objet (Object oriented programming). Si leur utilisation n’est pas particulièrement souhaitable pour générer de simples pages web dynamiques, en revanche, lorsqu’il s’agit de construire de véritables applications métier, aucune hésitation n’est permise – mais encore faut-il avoir compris leur utilité !
Les classes abstraites
Une classe abstraite est une classe dont toutes les méthodes n’ont pas été implémentées. Elle n’est donc pas instanciable, mais sert avant tout à factoriser du code. Une classe qui hérite d’une classe abstraite doit obligatoirement implémenter les méthodes manquantes (qui ont été elles-mêmes déclarées «abstraites» dans la classe parente). En revanche, elle n’est pas obligée de réimplémenter les méthodes déjà implémentées dans la classe parente (d’où une maintenance du code plus facile).
Les interfaces
Une interface est un peu comme une classe abstraite dans laquelle aucune méthode ne serait implémentée : les méthodes y sont seulement déclarées. Cela permet de définir un ensemble de services visibles depuis l’extérieur (l’API : Application Programming Interface), sans se préoccuper de la façon dont ces services seront réellement implémentés. Une classe qui implémente une interface doit obligatoirement implémenter chacune des méthodes déclarées dans l’interface, à moins qu’elle ne soit elle-même déclarée… abstraite !
Classe abstraite ou interface ?
Classes abtraites et interfaces ont chacune une fonction bien distincte : les classes abstraites servent à factoriser du code, tandis que les interfaces servent à définir des contrats de service. Et pourquoi ne pas utiliser des classes abstraites (dans lesquelles aucune méthode ne serait implémentée) en lieu et place des interfaces ? La réponse est simple : dans la plupart des langages actuels (c’est notamment le cas de Java, C#, PHP), il n’est possible pour une classe d’hériter que d’une seule classe parente (abstraite ou non), mais d’implémenter plusieurs interfaces.