La fonction "magique"__autoload() est arrivée avec PHP5 et permet comme vous le savez certainement d'inclure automatiquement les classes utilisées sans avoir à faire des include() ou require() à chaque utilisation. L'utilisation la plus basique est :
PHP:
<?php
function __autoload($classname) {
require $classname . '.php';
}
?>
A chaque fois qu'on utilise une classe non encore définie, PHP recherche si la fonction __autoload() est implémentée, et si c'est le cas exécute cette fonction (en gros). Il est donc possible de faire tout un tas de choses dans cette fonction. J'ai déjà vu des implémentations qui scannaient tous les répertoires des librairies afin d'inclure la définition. Je n'imagine pas l'impact au niveau des performances de l'application.
Mais dès que l'on utilise plusieurs librairies, on comprend pourquoi l'utilisation de cette fonction peut vite devenir complexe.
En effet, la plupart des frameworks ont leur propre convention de nommage, et il devient vite impossible de gérer l'auto-chargement de classes avec la fonction __autoload(). Une fois de plus la
SPL nous offre une alternative avec
spl_autoload_register().
En effet celle-ci permet d'enregistrer plusieurs fonctions ou méthodes (statiques) de classes qui seront appelées pour trouver la définition d'une classe. Là, il devient aisé de travailler avec plusieurs frameworks. Imaginons par exemple, que vous ayez défini votre propre fonction __autoload() et que vous travaillez avec le framework Zend, EZ et Doctrine, cela donne :
PHP:
<?php
function mon_autoload($classname) {
//do something
}
spl_autoload_register(array('Doctrine', 'autoload'));
spl_autoload_register(array('Zend', 'loadClass'));
spl_autoload_register(array('Zend', 'loadInterface'));
spl_autoload_register(array('ezcBase', 'autoload'));
spl_autoload_register('mon_autoload');
?>
Un peu plus sexy non?