1. Si la fonction __autoload() est appelée, c'est que la classe n'est pas définie, donc il est inutile de vérifier qu'elle n'existe pas à l'aide de class_exists().
  2. Si la classe n'existe pas, c'est que le fichier la définissant n'a jamais été inclus, donc il n'y a aucun besoin de faire appel à require_once(), un simple require() est suffisant.

Certain pourrait me retorquer que l'appel à class_exists() a sa raison d'être si le développeur choisit d'utiliser directement __autoload() pour charger une classe à la demande, d'une manière analogue à require_once() ou require().

Je leur répondrai que je ne vois pas alors l'intérêt d'utiliser le mécanisme d'autoloading si ce n'est pas pour s'en servir.

Ensuite, je vous ai induit en erreur, car il n'y a pas deux, mais bien trois paradoxes dans ce code.

Certain l'ont en parti détecté, mais sans aller jusqu'au bout de leur réflexion.

Ce troisième paradoxe est induit par l'utilisation du second paramètre passé à class_exists(), en l'occurence false.

Sans ce paramètre, class_exists()utilise le mécanisme d'autoloading pour tenter de charger la classe si elle n'existe pas.

Dans notre contexte, s'il n'avait pas été utilisé, il y aurait eu un réel risque de générer une boucle infinie dans le cas ou la classe que __autoload() doit charger n'existe pas, ce qui est forcément le cas puisque nous sommes justement dans ce cas lorsque cette fonction est appelée par PHP.

En effet, __autoload() aurait fait appel à class_exists() qui aurait fait appel à __autoload() qui aurait fait appel... vous connaissez la suite.

Le troisième paradoxe est donc qu'un ou plusieurs développeurs ont été suffisament intelligent pour utiliser correctement class_exists() dans le cadre d'une fonction __autoload() alors qu'ils faisaient dans le même temps quelque chose de complétement con inutile.

Enfin, certain ont relevé un problème relatif à l'utilisation de dirname().

De mon point de vue, c'est plus un problème lié à la performance du code qu'un réel paradoxe.

Voici donc une version fonctionnellement identique du code concerné, mais corrigée et optimisée :

function __autoload($className)
{
static $classesDirectory = null;

if ($classesDirectory === null)
{
$classesDirectory = realpath(dirname(__FILE__).'/../classes') . '/';
}

require($classesDirectory.$className.'.php');
}