Actualités WEB et WordPress, thèmes, plugins. Ici, nous partageons des conseils et les meilleures solutions de sites Web.

Comment implémenter un chargeur automatique avec des espaces de noms dans votre thème ou plugin WordPress

16

Si vous écrivez du code orienté objet, un chargeur automatique est indispensable. Sans chargeur automatique, vous auriez besoin d’ajouter une ligne avec le fichier de classe avant de pouvoir l’initialiser. Cela peut vite être fastidieux quand on travaille avec beaucoup de classes. Un chargeur automatique est une fonction qui se déclenche à chaque fois qu’une nouvelle classe est instanciée et inclut le fichier de classe avant que l’instanciation ne se produise.

Les espaces de noms sont un moyen de structurer et d’encapsuler votre code, et aident à éviter les collisions de noms. Si vous allez écrire de la POO, il est également recommandé d’utiliser des espaces de noms. Gardez à l’esprit que vous pouvez implémenter un chargeur automatique sans utiliser d’espaces de noms dans votre code OOP.

Vous pouvez utiliser ce code pour votre thème ou plugin WordPress, ou tout code PHP en dehors de WordPress d’ailleurs – modifiez simplement les chemins en conséquence. Pour cet exemple, je crée un chargeur automatique pour un thème WordPress.

Règles pour l’espace de noms et la structure des classes

L’implémentation d’un chargeur automatique nécessiterait des règles définies pour votre structure de code et où les trouver. L’utilisation d’espaces de noms simplifie quelque peu cela, car votre espace de noms peut faire référence au dossier dans lequel se trouvent les classes.

Décidez d’abord du nom de votre espace de noms. Habituellement, c’est quelque chose d’unique pour votre code, par exemple le nom de votre thème. Par exemple, l’espace de noms pour le thème de ce site est AWhitePixelTheme. Cela signifie que pour que le chargeur automatique fonctionne, toutes les classes doivent se trouver dans cet espace de noms.

namespace AWhitePixelTheme;

Ma première règle est que tout fichier de classe ne contiendra toujours qu’une seule classe et que le nom de la classe doit être le même que le nom du fichier. Par exemple; une classe MyTestdoit être définie dans un fichier MyTest.php.

Ma deuxième règle est de savoir comment structurer les classes dans des dossiers. Je décide que toutes les classes vont dans un dossier srcde mon thème. Je peux mettre des fichiers de classe directement dans ce dossier, et pour cela ils doivent être à l’intérieur de l’espace de noms "racine" défini ci-dessus. Mais si je veux créer des sous-dossiers et y mettre des fichiers de classe, leurs espaces de noms doivent inclure la structure du dossier. Par exemple une classe fichier MyTest.phpqui réside dans le dossier src/Test/, doit avoir cet espace de noms défini :

namespace AWhitePixelThemeTest;

Création du chargeur automatique

J’aime conserver le chargeur automatique dans un fichier séparé et en dehors du src/dossier défini uniquement pour les fichiers de classe à espace de noms. Par exemple, je vais créer un fichier autoloader.phpdans le dossier inc/de mon thème.

PHP a une fonction de chargement automatique intégrée: spl_autoload_register. Vous fournissez le nom de votre fonction de chargement automatique en tant que paramètre, et dans cette fonction, vous obtenez la classe demandée en tant qu’argument (ce que vous mettez après newlors de l’instanciation de la classe). Lors de l’instanciation de classes avec des espaces de noms, par exemple new AWhitePixelThemeTestMyTest(), la variable fournie à cette fonction serait "AWhitePixelThemeTestMyTest".

Ajoutons la fonction autoloader, et nous y définissons notre espace de noms requis pour l’autoloader :

Ensuite, nous devons inclure ce fichier afin que notre chargeur automatique soit enregistré. Comme c’est dans un thème, je vais ajouter l’include dans le fichier functions.php. Si vous l’utilisez pour un plugin, placez-le dans vos fichiers de plugin. Le fichier de chargement automatique doit être ajouté tôt, avant toute instanciation de classes. Je mets ceci à la toute première ligne de mon functions.php:

require_once(get_template_directory(). '/inc/autoloader.php');

Si vous l’utilisez pour un thème enfant ou un plugin, modifiez le chemin selon vos besoins.

Et c’est tout. Maintenant, le chargeur automatique est en place, mais il ne fait rien. Revenons à la fonction de chargement automatique et terminons-la.

Ecrire et tester la fonction de chargement automatique

Nous devons d’abord nous assurer que le nom de classe demandé se trouve bien dans notre espace de noms. Nous vérifions simplement si le nom de classe d’espace de noms fourni contient la chaîne d’espace de noms, et si ce n’est pas le cas, nous quittons la fonction. Après cela, nous supprimons le nom de l’espace de noms de la chaîne, afin que nous puissions travailler sur tous les sous-dossiers et fichiers de classe.

Nous allons maintenant transformer l’espace de noms fourni en un véritable chemin d’accès au fichier. Tout d’abord, nous remplacerons toute barre oblique inverse ""dans l’espace de noms par le caractère du séparateur de dossier – pour cela, nous utilisons la constante PHP DIRECTORY_SEPARATOR. À la toute fin, nous ajoutons un ".php". Et enfin avant la chaîne, nous ajoutons le chemin racine complet. Parce que c’est à l’intérieur d’un thème, j’utilise get_template_directory(). Si vous l’utilisez pour un plugin, utilisez une méthode qui renvoie le chemin complet de votre plugin.

... $class = str_replace($namespace, '', $class);   $class = str_replace('', DIRECTORY_SEPARATOR, $class). '.php'; $directory = get_template_directory(); $path = $directory. DIRECTORY_SEPARATOR. 'src'. DIRECTORY_SEPARATOR. $class; }

Tout ce que nous devons faire maintenant est de vérifier si le fichier existe et, si c’est le cas, de l’exiger.

... $path = $directory. DIRECTORY_SEPARATOR. 'src'. DIRECTORY_SEPARATOR. $class;   if (file_exists($path)) { require_once($path); } }

C’est ça!

Testons-le. Créez un sous-dossier Testdans le dossier de votre thème src/et placez-y un fichier php nommé MyTest.php. Définissez- MyTesty une classe en suivant les règles de l’espace de noms : AWhitePixelThemeTest. Je vais juste ajouter une impression de ‘Success’ dans la fonction de construction afin que nous puissions facilement voir qu’elle initialise réellement la classe.

Dans notre functions.php, après avoir demandé l’autoloader, nous instancions simplement la classe :

$test = new AWhitePixelThemeTestMyTest();

Actualisez votre site WordPress et constatez que vous obtenez le « Succès ! » sortie.

Le chargeur automatique chargera automatiquement tous les fichiers de classe qui se trouvent dans notre espace de noms défini et suivra les règles correctes. Vous pouvez instancier des classes depuis n’importe où dans votre thème, même à l’intérieur des classes elles-mêmes.

La fonction complète de chargeur automatique

Pour référence, voici notre dernière fonction de chargement automatique :

spl_autoload_register('awhitepixel_autoloader'); function awhitepixel_autoloader($class) { $namespace = 'AWhitePixelTheme';   if (strpos($class, $namespace) !== 0) { return; }   $class = str_replace($namespace, '', $class); $class = str_replace('', DIRECTORY_SEPARATOR, $class). '.php';   $directory = get_template_directory(); $path = $directory. DIRECTORY_SEPARATOR. 'src'. DIRECTORY_SEPARATOR. $class;   if (file_exists($path)) { require_once($path); } }

Source d’enregistrement: awhitepixel.com

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More