Il y a quelques années, je me souviens avoir travaillé sur un projet ASP assez complexe qui avait nécessité l'écriture de nombreuses classes. Comme certaines classes fonctionnaient par composition d'objets, je devais inclure en entête du script principal toutes les dépendances et surtout ne pas en oublier. Parfois, un fichier en incluait un autre (à éviter) ou incluait le même qu'une autre librairie et comme ASP n'avait pas de mécanisme équivalent aux méthodes include_once() ou require_once() de PHP, certaines erreurs de redéfinitions survenaient.
En PHP 5, on a la possibilité d'utiliser une fonction nommée __autoload() qui permet, lorsqu'on déclare un objet qui n'est pas défini, de charger automatiquement la librairie reliée. Ce mécanisme permet donc d'inclure dynamiquement les librairies dépendantes lorsqu'elles sont requises, plutôt que de les inclure comme on le faisait traditionnellement en PHP 4 ou en ASP.
Dans un fichier de configuration global au projet (c'est-à-dire inclus à toutes les pages), on pourra définir la fonction qui effectuera le travail pour nous. Idéalement, on ajoutera aussi le chemin menant au répertoire des classes dans le fichier php.ini (variable de configuration include_path). Sinon, on devra spécifier le chemin d'accès aux classes à l'intérieur de la fonction __autoload().
Pour simplifier l'exemple suivant, j'ai spécifié dans php.ini le chemin du répertoire où je conserve toutes mes classes (donc transparent dans le code).
Dans le fichier principal, comme la librairie DBI.php n'est pas incluse et que la classe DBI n'est pas définie, lorsque PHP tente de créer l'objet DBI et qu'il ne le trouve pas, la fonction __autoload() est déclenchée pour tenter de la charger. La fonction reçoit en paramètre le nom de la classe et lui concatène l'extension PHP pour obtenir le nom du fichier à inclure. Malgré une légère perte de performance, ce service nous donne un souci en moins et peut être utilisé même si les classes sont incluses explicitement au projet car la fonction __autoload() est appelée seulement lorsqu'il ne trouve pas la définition de la classe. Il n'y a donc pas de raison de ne pas en tirer profit.// Dans le fichier de configuration config.php
<?php
function __autoload($classname) {
require_once($classname . '.php');}
// Dans le fichier principal
<?php
require_once('config.php');
$obj = new DBI();