spl_autoload_register()
vous permet d'enregistrer plusieurs fonctions (ou méthodes statiques de votre propre classe Autoload) que PHP mettra dans une pile / file d'attente et appellera séquentiellement lorsqu'une "nouvelle classe" sera déclarée.
Ainsi, par exemple:
spl_autoload_register('myAutoloader');
function myAutoloader($className)
{
$path = '/path/to/class/';
include $path.$className.'.php';
}
//-------------------------------------
$myClass = new MyClass();
Dans l'exemple ci-dessus, "MyClass" est le nom de la classe que vous essayez d'instancier, PHP transmet ce nom sous forme de chaîne à spl_autoload_register()
, ce qui vous permet de récupérer la variable et de l'utiliser pour "inclure" la classe / le fichier approprié . Par conséquent, vous n'avez pas besoin spécifiquement d'inclure cette classe via une instruction include / require ...
Appelez simplement la classe que vous souhaitez instancier comme dans l'exemple ci-dessus, et puisque vous avez enregistré une fonction (via spl_autoload_register()
) de votre choix qui déterminera où se trouve toute votre classe, PHP utilisera cette fonction.
L'avantage de l'utilisation spl_autoload_register()
est que, contrairement à __autoload()
vous, vous n'avez pas besoin d'implémenter une fonction de chargement automatique dans chaque fichier que vous créez. spl_autoload_register()
vous permet également d'enregistrer plusieurs fonctions de chargement automatique pour accélérer le chargement automatique et le rendre encore plus facile.
Exemple:
spl_autoload_register('MyAutoloader::ClassLoader');
spl_autoload_register('MyAutoloader::LibraryLoader');
spl_autoload_register('MyAutoloader::HelperLoader');
spl_autoload_register('MyAutoloader::DatabaseLoader');
class MyAutoloader
{
public static function ClassLoader($className)
{
//your loading logic here
}
public static function LibraryLoader($className)
{
//your loading logic here
}
En ce qui concerne spl_autoload , le manuel indique:
Cette fonction est destinée à être utilisée comme implémentation par défaut pour __autoload()
. Si rien d'autre n'est spécifié et spl_autoload_register()
est appelé sans aucun paramètre, ces fonctions seront utilisées pour tout appel ultérieur à __autoload()
.
En termes plus pratiques, si tous vos fichiers se trouvent dans un seul répertoire et que votre application utilise non seulement des fichiers .php, mais des fichiers de configuration personnalisés avec des extensions .inc par exemple, alors une stratégie que vous pourriez utiliser serait d'ajouter votre répertoire contenant tous les fichiers vers le chemin d'inclusion de PHP (via set_include_path()
).
Et puisque vous avez également besoin de vos fichiers de configuration, vous utiliseriez spl_autoload_extensions()
pour répertorier les extensions que vous souhaitez que PHP recherche.
Exemple:
set_include_path(get_include_path().PATH_SEPARATOR.'path/to/my/directory/');
spl_autoload_extensions('.php, .inc');
spl_autoload_register();
Puisque spl_autoload est l'implémentation par défaut de la __autoload()
méthode magique, PHP appellera spl_autoload lorsque vous essayez d'instancier une nouvelle classe.
J'espère que cela t'aides...
spl_autoload_register()
(et__autoload()
en général) que les charges paresseuses incluent les fichiers / classes? Cela est implicite dans la réponse, mais pas explicitement indiqué. Pour moi, ce sont des informations essentielles qui seraient parfaites pour être incluses dans votre réponse! :)Depuis PHP 5.3, vous pouvez utiliser
spl_autoload_register()
avec des espaces de noms, ce qui signifie que vous pouvez organiser votre projet et charger automatiquement vos classes php sans aucune exigence ou inclusion et sans redéfinir une__autoload()
fonction.Pour illustrer ce comportement, créez simplement un fichier appelé index.php:
Créez ensuite un dossier nommé Main situé juste à côté du fichier index.php. Enfin, crée un fichier appelé Application.php situé dans Main et collez-y le code suivant:
la source
spl_autoload_register()
l'implémentation par défaut ne parvient pas à trouver les classes héritées. Donc, en utilisant les valeurs par défaut, les fichiers en minuscules et les répertoires reflétant le chemin de l'espace de noms, tout fonctionne bien, sauf si j'ai une classe qui étend une autre classe (parent). PHP lance ensuite une erreur selon laquelle il ne peut pas trouver cette classe parente, même s'ils sont tous dans le même répertoire / espace de noms! Ce qui est déroutant, c'est que seules les classes de premier niveau sont littéralement trouvées, j'ai donc dû en mettre une autrespl_autoload_register()
avec une règle de fonction anonyme juste après la première pour pouvoir inclure manuellement les classes parent / héritées manquantes.Voici comment j'utilise le chargement automatique. Dans l'exemple donné, je veux charger les classes de 3 répertoires différents.
Dans l'exemple donné, le PHP recherchera l'espace de noms \ classe dans ces trois répertoires en utilisant ces trois formats de nom de fichier différents.
la source