Question

spl_autoload_register peut faire ce genre de travail, mais je ne comprends pas comment est ce genre de travail fait?

spl_autoload_register(array('Doctrine', 'autoload'));
Était-ce utile?

La solution

L'idée de base est que vous n'avez pas d'écrire des instructions include / require de plus. Chaque fois que vous essayez d'utiliser une classe non définie, PHP appellera le chargeur automatique

Le travail du chargeur automatique, alors, est de déterminer quel fichier doit être chargé et include, donc la classe devient définie.

PHP peut alors utiliser cette classe, comme si vous étiez celui qui a écrit l'instruction include, qui a en fait été exécutée dans la fonction de chargement automatique.


Le « truc » est que la fonction de chargement automatique:

  • ne reçoit que le nom de la classe
  • doit déterminer le fichier à charger - à-dire qui contient ce fichier classe
  • .

Ceci est la raison de convention de nommage, comme le PEAR une, qui dit que la classe tels que Project_SubProject_Component_Name sont mis en correspondance avec des fichiers tels que Project/SubProject/Component/Name.php - à savoir « _ » dans les noms de classe sont remplace par des barres obliques (répertoires , les sous-répertoires) sur le système de fichiers.


Par exemple, si vous jetez un oeil à la méthode Doctrine_Core::autoload, qui est celui qui sera appelé comme un chargeur automatique dans votre cas, il contient cette partie de code (après avoir traité certains cas spécifiques) :

$class = self::getPath() 
            . DIRECTORY_SEPARATOR . 
            str_replace('_', DIRECTORY_SEPARATOR, $className) 
            . '.php';
if (file_exists($class)) {
    require $class;
    return true;
}
return false;

Ce qui signifie que son nom de classe est mis en correspondance avec le système de fichiers, en remplaçant « _ » par « / », et en ajoutant un .php final au nom de fichier.

Par exemple, si vous essayez d'utiliser la classe Doctrine_Query_Filter_Chain, et on ne sait pas par PHP, la fonction Doctrine_Core::autoload sera appelée; il va déterminer que le fichier qui doit être chargé est Doctrine/Query/Filter/Chain.php; et que ce fichier existe, il sera inclus -. ce qui signifie que PHP maintenant « connaît » la classe Doctrine_Query_Filter_Chain

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top