Chargement automatique de classes avancé avec PHP 5 Chargement automatique de classes avancé avec PHP 5

PHP 5 introduit le chargement automatique des dépendances lors de l'utilisation d'une classe non définie. Ce qui permet un chargement dynamique plus fin, et de meilleures performances.


l'autoloading est arrivé pour faciliter la vie des développeurs dans la gestion
L'autoloading est arrivé pour faciliter la vie des développeurs dans la gestion des dépendances. © JDN Solutions

PHP 5 a introduit de nombreux nouveaux concepts intéressants, notamment le chargement automatique des dépendances lors de l'utilisation d'une classe non définie. On utilise généralement à cette fin la fonction magique __autoload(). Mais depuis PHP 5.1.2, une séries de fonctions issues de la SPL (Standard PHP Library) spl_autoload_*() sont apparues.

Cet ensemble de fonction permet de mettre en place une stratégie de chargement dynamique plus fin, et nous allons ici essayer de découvrir pourquoi et comment.


Autoloading simple

Avant de rentrer dans les détails violents, nous allons commencer par faire un petit rappel (ou tout du moins une introduction) sur la notion. Les développeurs qui ne sont pas vraiment familiers avec le langage ne seront pas perdus : les mécanismes mis en place ici sont tout à fait accessibles.

On donne généralement plusieurs noms à cette fonctionnalité apparue avec PHP 5 : autoloading, chargement dynamique (ou automatique) de classes, inclusion implicite, et j'en passe. En fait, tous ces noms sont corrects... en fonction de la manière dont vous l'utiliserez. Disons qu'à la base, l'autoloading est arrivé pour faciliter la vie des développeurs dans la gestion des dépendances.


__autoload() : une fonction magique allégeant l'écriture du code

Dans un projet où l'orienté objet prend une place importante, on se retrouve souvent avec de nombreuses classes, elles-mêmes généralement réparties dans de nombreux fichiers (souvent une ou deux classes par fichier).

Le développeur devait alors vérifier l'existence d'une classe avant de l'utiliser : il est nécessaire de demander à PHP d'interpréter sa définition pour qu'elle "existe". On observait alors souvent une série de directives include ou require en tête de fichier, voire include_once et require_once pour éviter une inclusion multiple, causant une erreur fatale puisque PHP interdit la redéfinition d'un symbole existant. C'était un peu abstrait, mais j'imagine que vous ne découvrez pas ces problèmes si vous prenez la peine de vous renseigner sur le chargement automatique.

La fonction magique __autoload() a donc été introduite pour supprimer ces nombreuses inclusions, dont la maintenance devient fastidieuse dès que l'organisation des fichiers de l'application change un peu. On dit que cette fonction est magique, pas seulement parce qu'elle rend un grand service, mais aussi parce que PHP va être capable de l'appeler tout seul au bon moment, sans l'aide du développeur, afin d'alléger l'écriture du code. En fait, lorsque l'interpréteur rencontrera un nom (ou symbole) de classe inconnu, il appellera implicitement cette fonction en passant ce nom en paramètre.

À titre informatif, il est impossible de lancer une exception dans la fonction __autoload() car elle est exécuté à un moment qui ne peut être défini à priori (lors de l'interprétation du fichier ou de l'exécution du code utilisant la classe, par exemple). Plusieurs solutions basées sur la création dynamique d'une classe à l'aide de la fonction eval() on été proposées. Je les trouve généralement inutiles et dangereuses.