{"id":229222,"date":"2022-10-29T09:53:00","date_gmt":"2022-10-29T06:53:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229222"},"modified":"2022-11-09T06:01:41","modified_gmt":"2022-11-09T03:01:41","slug":"espaces-de-noms-et-chargement-automatique-dans-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/espaces-de-noms-et-chargement-automatique-dans-wordpress\/","title":{"rendered":"Espaces de noms et chargement automatique dans WordPress"},"content":{"rendered":"\n<p>La semaine derni\u00e8re, j&rsquo;ai fait ma pr\u00e9sentation au <a href=\"https:\/\/2017.atlanta.wordcamp.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordCamp Atlanta<\/a> sur les espaces de noms et le chargement automatique. (le titre complet \u00e9tait Namespaces, Autoloading, and Improving Plugin Architecture mais c&rsquo;est une bouch\u00e9e, n&rsquo;est-ce pas ?)<\/p>\n<p>En raison de la nature de la discussion, j&rsquo;ai choisi d&rsquo;\u00e9crire un article pour accompagner la publication, de partager les diapositives et de partager un exemple de plugin GitHub pour aider \u00e0 soutenir la discussion.<\/p>\n<p>Alors si vous \u00e9tiez pr\u00e9sents, merci (!) et voici le post, promis. Et pour ceux d&rsquo;entre vous qui n&rsquo;y ont pas particip\u00e9, j&rsquo;esp\u00e8re que cet article aidera toujours \u00e0 d\u00e9montrer les concepts et les sujets <a href=\"https:\/\/tommcfarlin.com\/wordcamp-atlanta-2017\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dont j&rsquo;ai discut\u00e9 au WordCamp<\/a>.<\/p>\n<h2>Espaces de noms et chargement automatique<\/h2>\n<p>Avant de parler des espaces de noms et du chargement automatique dans WordPress, la raison pour laquelle je veux en parler est que cela peut avoir un impact direct sur la qualit\u00e9 de votre code et cela peut le faire pendant des mois et des ann\u00e9es \u00e0 venir.<\/p>\n<p>Apr\u00e8s tout, beaucoup d&rsquo;entre nous, d\u00e9veloppeurs, ne se posent-ils pas d\u00e9j\u00e0 la question\u00a0:<\/p>\n<blockquote>\n<p>Comment rendre notre code meilleur qu&rsquo;il ne l&rsquo;est d\u00e9j\u00e0 ?<\/p>\n<\/blockquote>\n<p>Et beaucoup d&rsquo;entre nous sont assez intelligents pour savoir ce que nous ne savons pas. Nous sommes donc confront\u00e9s \u00e0 travailler dans le cadre des contraintes qui nous sont donn\u00e9es.<\/p>\n<p>Parfois, nous avons le temps d&rsquo;\u00e9tudier les moyens de le faire ; d&rsquo;autres fois, nous avons du travail avec les connaissances que nous avons. Et il n&rsquo;y a rien de mal \u00e0 cela.<\/p>\n<p>Mais parce que nous savons ce que nous ne savons pas, nous savons qu&rsquo;il y a du potentiel pour plus.<\/p>\n<h3>Tout d&rsquo;abord, votre code<\/h3>\n<p>Quand il s&rsquo;agit de parler de sujets comme les espaces de noms et le chargement automatique dans le contexte de WordPress, je pense que nous rencontrons souvent des r\u00e9ponses mitig\u00e9es.<\/p>\n<p>Apr\u00e8s tout, nous pourrions parler de choses comme <a href=\"https:\/\/codex.wordpress.org\/Theme_Customization_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">The Theme Customizer<\/a> ou l&rsquo; <a href=\"https:\/\/developer.wordpress.org\/rest-api\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API REST<\/a> ou quelque chose de plus amusant.<\/p>\n<p>Je veux dire, &quot;les espaces de noms et le chargement automatique&quot; ne semblent tout simplement pas excitants ou avanc\u00e9s par rapport aux nouvelles fonctionnalit\u00e9s et technologies disponibles, n&rsquo;est-ce pas\u00a0?<\/p>\n<p>Mais non, ils ne sont pas vraiment ennuyeux. Et \u00e0 travers cet article et la pr\u00e9sentation et le code source qui l&rsquo;accompagnent, je vais vous montrer pourquoi et comment ils ne le sont pas.<\/p>\n<h4>Ils ne sont pas ennuyeux<\/h4>\n<p>Je pense qu&rsquo;il est juste de dire que les d\u00e9veloppeurs &#8211; au moins une partie d&rsquo;entre nous ou une partie d&rsquo;entre eux selon la fa\u00e7on dont vous vous voyez &#8211; sont connus pour discuter des aspects de la programmation.<\/p>\n<p>&quot;Conversation ennuyeuse de toute fa\u00e7on.&quot;<\/p>\n<p>En fait, il n&rsquo;est pas du tout rare d&rsquo;entendre quelqu&rsquo;un discuter de la meilleure fa\u00e7on d&rsquo;initialiser et d&rsquo;\u00e9crire une boucle for aussi performante que possible lors de l&rsquo;it\u00e9ration sur un petit ensemble de base de donn\u00e9es malgr\u00e9 le fait que nous ayons des processeurs quadric\u0153urs et 16 Go de RAM. dans nos machines de bureau.<\/p>\n<p>Donc, si nous nous soucions autant de quelque chose d&rsquo;aussi petit, nous nous soucions s\u00fbrement de l&rsquo;image plus grande. Des choses telles que :<\/p>\n<ul>\n<li>Code am\u00e9lior\u00e9<\/li>\n<li>Meilleure organisation<\/li>\n<li>Maintenabilit\u00e9 accrue<\/li>\n<li>D\u00e9bogage plus facile<\/li>\n<li>Gagner plus d&rsquo;argent (enfin, peut-\u00eatre).<\/li>\n<\/ul>\n<p>Et les espaces de noms et le chargement automatique peuvent mener directement \u00e0 tout ce qui pr\u00e9c\u00e8de (enfin, je ne peux pas parler d&rsquo;argent, mais cela a du potentiel).<\/p>\n<p>Si je devais r\u00e9sumer les espaces de noms de r\u00f4le et le lieu de chargement automatique dans tout ce qui pr\u00e9c\u00e8de, je dirais que\u00a0:<\/p>\n<p>Les espaces de noms et le chargement automatique conduisent \u00e0 un code am\u00e9lior\u00e9 gr\u00e2ce \u00e0 une meilleure organisation, compartimentation ou modularisation, et \u00e0 une relation plus \u00e9troite gr\u00e2ce \u00e0 leurs concepts.<\/p>\n<p>De plus, cela augmente la maintenabilit\u00e9 car le code est organis\u00e9 en packages, ce qui peut faciliter le d\u00e9bogage \u00e0 mesure que le produit se d\u00e9veloppe.<\/p>\n<p>Tout cela peut entra\u00eener un gain de temps ou une meilleure utilisation du temps, ce qui, selon votre mod\u00e8le d&rsquo;entreprise, peut avoir un impact sur vos r\u00e9sultats.<\/p>\n<p>Mais cela ne d\u00e9crit toujours aucune de ces choses. Mais s\u00fbrement, \u00e0 ce stade, ils semblent plus int\u00e9ressants que lorsqu&rsquo;ils ont \u00e9t\u00e9 introduits pour la premi\u00e8re fois.<\/p>\n<h4>Alors, qu&rsquo;est-ce qu&rsquo;ils sont?<\/h4>\n<p>Avant d&rsquo;entrer dans les d\u00e9finitions de chacun et des r\u00f4les qu&rsquo;ils jouent, examinons comment le manque d&rsquo;espaces de noms et de chargement automatique dans WordPress a eu un impact n\u00e9gatif sur votre exp\u00e9rience lors de l&rsquo;utilisation de th\u00e8mes, de plugins, de modules compl\u00e9mentaires ou de tout ce que vous avez.<\/p>\n<p>Revenons un instant en arri\u00e8re et regardons chacun individuellement.<\/p>\n<h5>Espaces de noms<\/h5>\n<p>Imaginez que vous avez h\u00e9rit\u00e9 d&rsquo;un projet et que vous \u00eates sur le point de commencer \u00e0 travailler dessus. Dites que c&rsquo;est un plugin WordPress.<\/p>\n<p>Vous l&rsquo;installez ; vous allez l&rsquo;activer et vous recevez au moins l&rsquo;un de ces \u00e9l\u00e9ments\u00a0:<\/p>\n<ul>\n<li>Peut-\u00eatre voyez-vous ce message d&rsquo;organisation d\u00e9sagr\u00e9able en haut de la fen\u00eatre du navigateur affichant une trace de pile.<\/li>\n<li>Peut-\u00eatre voyez-vous un message indiquant un conflit avec un autre package existant.<\/li>\n<li>Ou peut-\u00eatre que lorsque vous essayez d&rsquo;activer un plugin, la page s&rsquo;actualise mais le plugin ne s&rsquo;active pas.<\/li>\n<li>Peut-\u00eatre avez-vous m\u00eame effectu\u00e9 un audit de code et voyez-vous des v\u00e9rifications class_exists dans toute la base de code.<\/li>\n<\/ul>\n<p>Tout ou partie de ce qui pr\u00e9c\u00e8de peut contribuer \u00e0 des probl\u00e8mes, bien s\u00fbr, avec les projets WordPress. Mais les espaces de noms peuvent vraiment r\u00e9soudre une grande partie de cela la plupart du temps.<\/p>\n<p>Autrement dit, la raison pour laquelle vous rencontrez ces probl\u00e8mes est que le code avec lequel vous travaillez fait partie de l&rsquo;espace de noms global (par rapport \u00e0 son espace de noms) et PHP n&rsquo;aime pas quand il y a des classes et des modules nomm\u00e9s la m\u00eame chose .<\/p>\n<p>Mais lorsque vous nommez quelque chose, vous lui donnez sa zone relative \u00e0 lui-m\u00eame qui fonctionnera toujours bien avec d&rsquo;autres composants m\u00eame s&rsquo;ils ont le m\u00eame nom de classe.<\/p>\n<h5>Chargeurs automatiques<\/h5>\n<p>En ce qui concerne les chargeurs automatiques, ils sont un peu moins compliqu\u00e9s \u00e0 certains \u00e9gards. Pensez d&rsquo;abord au code que vous \u00e9crivez ou au code avec lequel vous travaillez \u2013 en particulier dans le contexte des plugins WordPress \u2013 puis r\u00e9fl\u00e9chissez au nombre de fois que vous \u00e9crivez ou voyez ce qui suit :<\/p>\n<ul>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.include.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">comprendre<\/a><\/li>\n<li>inclure_une fois<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.require.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">exiger<\/a><\/li>\n<li>Demandez une fois<\/li>\n<\/ul>\n<p>Et parfois, vous les voyez en haut du fichier qui d\u00e9marre le plugin, et parfois vous les voyez dispers\u00e9s dans la base de code.<\/p>\n<p>S&rsquo;ils sont tous contenus dans un seul fichier, ce n&rsquo;est pas aussi grave car au moins vous savez o\u00f9 ils se trouvent. Mais s&rsquo;ils sont jonch\u00e9s partout, alors vous n&rsquo;avez aucune id\u00e9e d&rsquo;o\u00f9 une d\u00e9pendance est introduite dans le syst\u00e8me.<\/p>\n<p>Le chargement automatique peut r\u00e9soudre tout cela en chargeant les d\u00e9pendances en cas de besoin (et pour ceux qui sont int\u00e9ress\u00e9s, le chargement automatique est plus rapide que l&rsquo;inclusion manuelle).<\/p>\n<h2>Espaces de noms<\/h2>\n<p>Cela dit, nous sommes pr\u00eats \u00e0 parler \u00e0 la fois des espaces de <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">noms<\/a> et du chargement automatique. Mais les espaces de noms sont le concept fondamental, nous allons donc commencer par l\u00e0.<\/p>\n<p>Mais apr\u00e8s tout ce qui pr\u00e9c\u00e8de, vous pouvez voir les avantages de leur utilisation. Peut-\u00eatre m\u00eame qu&rsquo;ils sont amusants, n&rsquo;est-ce pas\u00a0? Peut-\u00eatre?<\/p>\n<p>Quoi qu&rsquo;il en soit, nous avons besoin d&rsquo;une d\u00e9finition \u00e0 partir de laquelle nous pouvons travailler lorsque nous en parlons pour le reste de l&rsquo;article.<\/p>\n<p>Le manuel PHP <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.rationale.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">fournit la d\u00e9finition suivante<\/a> :<\/p>\n<blockquote>\n<p>Les espaces de noms sont con\u00e7us pour r\u00e9soudre deux probl\u00e8mes rencontr\u00e9s par les auteurs de biblioth\u00e8ques et d&rsquo;applications lors de la cr\u00e9ation d&rsquo;\u00e9l\u00e9ments de code r\u00e9utilisables tels que des classes ou des fonctions\u2026<\/p>\n<\/blockquote>\n<p>Et ce n&rsquo;est pas mal, mais c&rsquo;est assez long, technique, et c&rsquo;est peut-\u00eatre un peu trop pour ceux qui d\u00e9butent. Alors simplifions un peu pour cet article :<\/p>\n<p>Un peu mieux, peut-\u00eatre ?<\/p>\n<blockquote>\n<p>Un moyen de regrouper des classes et des interfaces li\u00e9es ayant un objectif similaire.<\/p>\n<\/blockquote>\n<p>Je ne vais pas parler d&rsquo;interfaces dans cet expos\u00e9\u00a0; cependant, je sais qu&rsquo;il existe des d\u00e9veloppeurs orient\u00e9s objet de niveau interm\u00e9diaire qui les utilisent, donc je voulais m&rsquo;assurer de les mentionner au moins.<\/p>\n<h3>Un exemple pratique<\/h3>\n<p>Je n&rsquo;aime pas les exemples de programmation qui ne donnent pas d&rsquo;applications r\u00e9elles ou pratiques. Souvent, on nous donne des exemples de choses que nous ne codifierions jamais.<\/p>\n<p>Combien de fois avez-vous lu un article orient\u00e9 objet et il donne un exemple d&rsquo;une classe d&rsquo;animaux ou d&rsquo;une classe de voitures\u00a0? Nous n&rsquo;allons pas programmer une voiture.<\/p>\n<p>Nous sommes beaucoup plus susceptibles de travailler avec des fichiers. Nous allons donc nous int\u00e9resser \u00e0 un ensemble de classes charg\u00e9es de lire et d&rsquo;\u00e9crire des fichiers. C&rsquo;est-\u00e0-dire que nous avons \u00e9t\u00e9 de bons programmeurs orient\u00e9s objet et avons s\u00e9par\u00e9 nos classes en fonction des responsabilit\u00e9s qu&rsquo;elles assument.<\/p>\n<p>Et oui, vous pouvez avoir des interfaces ; cependant, ils sortent du cadre de cet article, ils ne seront donc pas inclus.<\/p>\n<p>Donc, pour notre FileReader, peut-\u00eatre que les bases de la classe ressemblent \u00e0 ceci\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1413b1bb.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1413b1bb.jpg\" alt=\"Espaces de noms et chargement automatique dans WordPress\" ><\/a><\/p>\n<p>Une classe pour lire des fichiers.<\/p>\n<p>Notez que la fonction accepte le nom du fichier qu&rsquo;elle doit ouvrir en lecture. La v\u00e9rification des erreurs, la fa\u00e7on dont il lit le fichier et ce qu&rsquo;il renvoie d\u00e9pendent de l&rsquo;impl\u00e9mentation de la classe.<\/p>\n<p>Et pour le FileWriter, nous avons quelque chose comme \u00e7a :<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a143c699f.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a143c699f.jpg\" alt=\"Espaces de noms et chargement automatique dans WordPress\" ><\/a><\/p>\n<p>Une classe pour \u00e9crire des fichiers.<\/p>\n<p>Cette classe, en revanche, accepte les informations qu&rsquo;elle va \u00e9crire sur le disque et le nom du fichier dans lequel elles doivent \u00eatre \u00e9crites.<\/p>\n<p>Encore une fois, comme dans l&rsquo;exemple ci-dessus, cela n&rsquo;inclut pas la v\u00e9rification des erreurs, l&rsquo;\u00e9criture via une ressource, la fermeture des ressources, etc.<\/p>\n<p>Mais il ne s&rsquo;agit pas de travailler avec des fichiers. Au lieu de cela, il s&rsquo;agit de montrer comment espacer les noms de votre code, et ces deux exemples sont cens\u00e9s \u00eatre fondamentaux pour cela.<\/p>\n<h3>Remarques sur les espaces de noms<\/h3>\n<p>Il y a une mise en garde \u00e0 ce que vous voyez dans les images de l&rsquo;exemple de code ci-dessus\u00a0: ces classes ne sont pas dot\u00e9es d&rsquo;un espace de noms. C&rsquo;est-\u00e0-dire qu&rsquo;ils r\u00e9sident dans l&rsquo;espace de noms global, ce qui les laisse m\u00fbrs pour des conflits avec d&rsquo;autres classes.<\/p>\n<p>Regardez-le de cette fa\u00e7on\u00a0: imaginez que vous empaquetez ce code dans un plugin pour quelqu&rsquo;un d&rsquo;autre, puis qu&rsquo;il charge un autre plugin qui a \u00e9galement un FileReader ou un FileWriter. Comme tout va faire partie du m\u00eame <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.global.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">espace de noms global<\/a>, vous allez \u00eatre confront\u00e9 \u00e0 un conflit.<\/p>\n<p>Rappelles toi:<\/p>\n<blockquote>\n<p>Les espaces de noms sont un moyen de regrouper des classes et des interfaces li\u00e9es ayant un objectif similaire.<\/p>\n<\/blockquote>\n<p>Prenons donc les classes et namespace le code.<\/p>\n<p>Tout d&rsquo;abord, nous fournirons un espace de noms de niveau sup\u00e9rieur sous lequel ces classes et toutes les autres classes r\u00e9sideront\u00a0; puis nous fournirons un sous-paquet (ou un sous-espace de noms ou un sous-espace comme je les ai entendus appeler) dans lequel ces classes de fichiers r\u00e9sideront.<\/p>\n<p>Cela signifie que notre FileReader ressemblera d\u00e9sormais \u00e0 ceci\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a146586f4.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a146586f4.jpg\" alt=\"Espaces de noms et chargement automatique dans WordPress\" ><\/a><\/p>\n<p>Une classe avec espace de noms pour lire des fichiers.<\/p>\n<p>Et notre FileWriter ressemblera maintenant \u00e0 ceci\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1487e5b2.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1487e5b2.jpg\" alt=\"Espaces de noms et chargement automatique dans WordPress\" ><\/a><\/p>\n<p>Une classe avec espace de noms pour \u00e9crire des fichiers.<\/p>\n<p>Tout d&rsquo;abord, vous pouvez voir que l&rsquo;utilisation des espaces de noms est facile\u00a0: vous utilisez simplement le mot-cl\u00e9 namespace, puis d\u00e9clarez l&rsquo;espace de noms (qui pourrait tout aussi bien \u00eatre WCATL) en haut avec les sous-paquetages suivants.<\/p>\n<p>Mais cela conduit \u00e0 d&rsquo;autres sujets &#8211; \u00e0 savoir autour de l&rsquo;organisation des fichiers, de l&rsquo;instanciation et du chargement automatique &#8211; qui m\u00e9ritent tous d&rsquo;\u00eatre couverts.<\/p>\n<h3>Sur l&rsquo;organisation du dossier<\/h3>\n<p>\u00c0 ce stade, il est important d&rsquo;avoir un mot sur l&rsquo;organisation des fichiers. En fonction de la personne \u00e0 qui vous parlez, vous constaterez que certains d\u00e9veloppeurs &#8211; surprise, surprise &#8211; ont une opinion sur la mani\u00e8re dont les fichiers doivent \u00eatre organis\u00e9s (et je ne suis pas diff\u00e9rent).<\/p>\n<p>D&rsquo;une part, vous n&rsquo;avez pas du tout \u00e0 organiser vos fichiers. En fait, vous pouvez tout d\u00e9poser dans le r\u00e9pertoire racine de votre projet, espacer les informations et \u00eatre pr\u00eat \u00e0 partir.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14ab117d.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14ab117d.jpg\" alt=\"Espaces de noms et chargement automatique dans WordPress\" ><\/a><\/p>\n<p>Fichiers non organis\u00e9s<\/p>\n<p>L&rsquo;ensemble de fichiers ci-dessus est destin\u00e9 \u00e0 un petit projet, vous pouvez donc imaginer combien de fichiers existeraient pour un grand projet.<\/p>\n<p>Mais lorsque vos fichiers sont organis\u00e9s de cette mani\u00e8re, cela peut rendre l&rsquo;\u00e9criture d&rsquo;un chargeur automatique un peu difficile, car un chargeur automatique doit savoir o\u00f9 trouver les fichiers en fonction de leur espace de noms.<\/p>\n<p>C&rsquo;est l\u00e0 qu&rsquo;interviennent les termes \u00aborganisation logique\u00bb et \u00aborganisation virtuelle \u00bb.<\/p>\n<ul>\n<li>L&rsquo;organisation logique fait r\u00e9f\u00e9rence \u00e0 la fa\u00e7on dont les fichiers sont organis\u00e9s sur le disque, comme ce que vous voyez ci-dessus. Ils sont logiquement situ\u00e9s dans le r\u00e9pertoire racine.<\/li>\n<li>L&rsquo;organisation virtuelle fait r\u00e9f\u00e9rence \u00e0 la fa\u00e7on dont les fichiers sont organis\u00e9s en fonction de leurs espaces de noms. Cela signifie qu&rsquo;il existe des r\u00e9pertoires et des sous-r\u00e9pertoires qui correspondent aux espaces de noms, aux sous-packages, etc.<\/li>\n<\/ul>\n<p>Donc, si vous deviez prendre le projet ci-dessus, ses espaces de noms, ses sous-paquetages, puis les organiser \u00e0 la fois logiquement et virtuellement, cela ressemblerait \u00e0 ceci\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14d9a198.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14d9a198.jpg\" alt=\"Espaces de noms et chargement automatique dans WordPress\" ><\/a><\/p>\n<p>Espaces de noms et chargement automatique\u00a0: fichiers organis\u00e9s<\/p>\n<p>Et bien que vous puissiez choisir d&rsquo;organiser vos fichiers comme bon vous semble, je suis partisan de m&rsquo;assurer qu&rsquo;il y a une parit\u00e9 entre les deux. Autrement dit, j&rsquo;aime que mon organisation logique et mon organisation virtuelle correspondent comme vous le voyez dans l&rsquo;image ci-dessus.<\/p>\n<p>Au fur et \u00e0 mesure que j&rsquo;aborderai la question du chargement automatique, vous comprendrez pourquoi cela est important.<\/p>\n<h2>Remarques sur les espaces de noms<\/h2>\n<p>Que se passe-t-il, cependant, lorsque nous devons instancier des classes qui ont un espace de noms\u00a0? Lorsque les classes n&rsquo;ont pas d&rsquo;espace de noms, il est facile d&rsquo;utiliser le mot-cl\u00e9 &lsquo;new&rsquo;.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14f8414e.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14f8414e.jpg\" alt=\"Espaces de noms et chargement automatique dans WordPress\" ><\/a><\/p>\n<p>Instanciation sans espace de noms.<\/p>\n<p>Mais nous devons instancier une classe namespaced, nous devons aller plus loin et utiliser le nom complet :<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1519c7ff.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1519c7ff.jpg\" alt=\"Espaces de noms et chargement automatique dans WordPress\" ><\/a><\/p>\n<p>Espaces de noms et chargement automatique\u00a0: instanciation avec un espace de noms.<\/p>\n<p>Mais cela devient fastidieux, n&rsquo;est-ce pas? Cet exemple particulier n&rsquo;est pas si mal, mais imaginez si vous travailliez sur quelque chose avec plus de sous-paquetages. Cela deviendrait assez lourd, n&rsquo;est-ce pas ?<\/p>\n<p>\u00c0 cette fin, nous pouvons utiliser ce qu&rsquo;on appelle l&rsquo;aliasing. C&rsquo;est simple aussi. Nous pouvons d\u00e9finir utiliser le mot-cl\u00e9 &lsquo;use&rsquo; en haut du fichier pour faire r\u00e9f\u00e9rence \u00e0 l&rsquo;espace de noms que nous voulons alias, puis utiliser le dernier sous-paquet dans le cadre de l&rsquo;alias pour instancier notre classe.<\/p>\n<p>Cela semble d\u00e9routant, n&rsquo;est-ce pas? Peut-\u00eatre que le voir en action aidera:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1541531b.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1541531b.jpg\" alt=\"Espaces de noms et chargement automatique dans WordPress\" ><\/a><\/p>\n<p>Espaces de noms d&rsquo;alias.<\/p>\n<p>Et c&rsquo;est tout ce qu&rsquo;il y a \u00e0 faire. Oui, vous pouvez <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.importing.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">aller plus loin dans l&rsquo;aliasing<\/a>, mais c&rsquo;est tout ce que je vais faire dans le contexte de cet article.<\/p>\n<h2>Chargement automatique<\/h2>\n<p>\u00c0 ce stade, nous avons pos\u00e9 les bases du chargement automatique. Oui, travailler avec des espaces de noms peut repr\u00e9senter beaucoup de travail si vous n&rsquo;y \u00eates pas habitu\u00e9 ; cependant, il est important de comprendre car le chargement automatique n\u00e9cessite un peu de travail qui peut \u00eatre inattendu si vous ne l&rsquo;avez jamais d\u00e9couvert auparavant.<\/p>\n<p>Quoi qu&rsquo;il en soit, les choses les plus importantes \u00e0 retenir concernant les espaces de noms, \u00e0 ce stade, sont\u00a0:<\/p>\n<ol>\n<li>Les espaces de noms sont un moyen de regrouper des classes et des interfaces li\u00e9es ayant un objectif similaire.<\/li>\n<li>Cr\u00e9ez la parit\u00e9 \u00e0 travers vos fichiers et espaces de noms en vous assurant que votre organisation logique et virtuelle sont les m\u00eames.<\/li>\n<\/ol>\n<p>Et maintenant, il est temps de se pencher sur le chargement automatique.<\/p>\n<h3>Remarques sur le chargement automatique<\/h3>\n<p>Voyons d&rsquo;abord la d\u00e9finition du chargement automatique telle qu&rsquo;elle est fournie <a href=\"https:\/\/php.net\/manual\/en\/language.oop5.autoload.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">par le manuel PHP<\/a> :<\/p>\n<blockquote>\n<p>La fonction spl_autoload_register() enregistre n&rsquo;importe quel nombre de chargeurs automatiques, permettant aux classes et aux interfaces d&rsquo;\u00eatre automatiquement charg\u00e9es si elles ne sont actuellement pas d\u00e9finies. En enregistrant les chargeurs automatiques, PHP a une derni\u00e8re chance de charger la classe ou l&rsquo;interface avant qu&rsquo;elle n&rsquo;\u00e9choue avec une erreur.<\/p>\n<\/blockquote>\n<p>Ce n&rsquo;est pas mauvais. C&rsquo;est long quand m\u00eame. Donc, tout comme nous l&rsquo;avons fait avec les espaces de noms, utilisons une d\u00e9finition plus courte pour cet article\u00a0:<\/p>\n<blockquote>\n<p>Un moyen de charger automatiquement des interfaces et des classes sans utiliser les instructions include et require.<\/p>\n<\/blockquote>\n<p>Encore une fois, nous n&rsquo;utiliserons pas d&rsquo;interfaces dans cet article, bien que certains d\u00e9veloppeurs le fassent. Et cela fournira la d\u00e9finition de travail pour le reste de cet article.<\/p>\n<h3>Un exemple pratique<\/h3>\n<p>Une fois que vous avez organis\u00e9 vos fichiers, leur espace de noms et qu&rsquo;ils sont pr\u00eats \u00e0 \u00eatre charg\u00e9s, il est temps de le faire, n&rsquo;est-ce pas\u00a0? Je veux dire:<\/p>\n<ol>\n<li>vos fichiers sont organis\u00e9s,<\/li>\n<li>vous \u00eates pr\u00eat \u00e0 les charger<\/li>\n<\/ol>\n<p>Il est donc temps de le faire automatiquement, n&rsquo;est-ce pas\u00a0? Mais il y a un hic. L&rsquo;ensemble des fichiers &quot;\u00e0 chargement automatique&quot; n\u00e9cessite un peu de travail.<\/p>\n<h3>\u00c9crire un chargeur automatique<\/h3>\n<p>C&rsquo;est-\u00e0-dire que c&rsquo;est automatique, mais cela demande encore un peu plus de travail de notre part. Avant d&rsquo;entrer dans ces \u00e9tapes, il est important de noter\u00a0:<\/p>\n<ol>\n<li>ce n&rsquo;est pas enti\u00e8rement automatis\u00e9,<\/li>\n<li>nous devons l&rsquo;\u00e9crire.<\/li>\n<\/ol>\n<p>Aussi agr\u00e9able que ce soit d&rsquo;avoir le code charg\u00e9 automatiquement, nous devons lire certaines donn\u00e9es, les analyser, puis essayer de charger le bon fichier.<\/p>\n<p>Mais en supposant que vous l&rsquo;\u00e9criviez correctement et que votre espace de noms et organisez vos fichiers de la m\u00eame mani\u00e8re pour chaque projet, vous pouvez r\u00e9utiliser votre chargeur automatique. Autrement dit, vous l&rsquo;\u00e9crivez une fois et vous pouvez l&rsquo;utiliser dans d&rsquo;autres projets.<\/p>\n<h3>\u00c9tapes pour un chargeur automatique<\/h3>\n<p>Lors de l&rsquo;\u00e9criture d&rsquo;un chargeur automatique, il n&rsquo;y a que quelques \u00e9tapes \u00e0 suivre. L&rsquo;autochargeur doit pouvoir r\u00e9pondre aux fichiers suivants\u00a0:<\/p>\n<ol>\n<li>O\u00f9 sont les fichiers ?<\/li>\n<li>Comment sont-ils nomm\u00e9s ?<\/li>\n<li>Le fichier existe-t-il ?<\/li>\n<\/ol>\n<p>Si tout ce qui pr\u00e9c\u00e8de est vrai (ou si vous pouvez r\u00e9pondre &quot;oui&quot; \u00e0 tous), alors l&rsquo;autochargeur fera ce qu&rsquo;il est cens\u00e9 faire.<\/p>\n<p>Nous allons jeter un \u0153il \u00e0 du code dans un instant, mais la premi\u00e8re chose \u00e0 noter est qu&rsquo;il utilise une fonction appel\u00e9e spl_autoload_register.<\/p>\n<p>SPL fait r\u00e9f\u00e9rence \u00e0 <a href=\"https:\/\/php.net\/manual\/en\/book.spl.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la biblioth\u00e8que PHP standard<\/a>, et la fonction accepte une fonction comme argument, et cette fonction accepte le nom de la classe qui va \u00eatre instanci\u00e9e. C&rsquo;est plus proc\u00e9dural qu&rsquo;orient\u00e9 objet, et j&rsquo;en parlerai dans un instant, mais il est important de garder \u00e0 l&rsquo;esprit que vous lisez ce code.<\/p>\n<p>Voici la premi\u00e8re partie du code. Je vais vous expliquer ce qu&rsquo;il fait apr\u00e8s coup:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1562a1b8.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1562a1b8.jpg\" alt=\"Espaces de noms et chargement automatique dans WordPress\" ><\/a><\/p>\n<p>Chargement automatique, partie 1 &#8211; Trouver la classe<\/p>\n<p>Dans cette partie du code, la fonction re\u00e7oit le nom complet de la classe \u00e0 instancier (comme &quot;WCATLFileFileReader()&quot;).<\/p>\n<p>Ensuite, il s\u00e9pare toutes les parties du nom complet en parties. Le nom de la classe est le dernier index du tableau, et j&rsquo;opte pour nommer mes fichiers comme &quot;class-filereader.php&quot; afin que la fonction cr\u00e9e une variable, $class_file, qui fait r\u00e9f\u00e9rence au nom du fichier.<\/p>\n<p>Mais nous n&rsquo;avons pas encore fini. Nous devons encore obtenir le nom complet (c&rsquo;est-\u00e0-dire l&#8217;emplacement du fichier sur le disque). Cela pourrait ressembler \u00e0 ceci\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a15910c7c.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a15910c7c.jpg\" alt=\"Espaces de noms et chargement automatique dans WordPress\" ><\/a><\/p>\n<p>Chargement automatique, partie 2 &#8211; Obtenir le nom complet<\/p>\n<p>\u00c0 ce stade, nous pr\u00e9parons une variable, $full_qualified_path, qui fera r\u00e9f\u00e9rence au r\u00e9pertoire de niveau sup\u00e9rieur.<\/p>\n<p>Ensuite, le code parcourt tous les index du tableau et cr\u00e9e un chemin pour le fichier de classe. Vous pouvez imaginer cela comme la construction d&rsquo;une cha\u00eene telle que &quot;wcatlfile&quot; que nous combinons ensuite avec le $class_file.<\/p>\n<p>Cela signifie que le chemin d&rsquo;acc\u00e8s complet au fichier devient &quot;wcatlfileclass-filereader.php&quot;.<\/p>\n<p>Et enfin, nous incluons le fichier. Notez que ce code ne v\u00e9rifie pas si le fichier existe. Bien que je le recommande, il a \u00e9t\u00e9 omis pour des raisons de longueur et parce que, dans notre exemple, nous savons que le fichier existe.<\/p>\n<p>Si le fichier n&rsquo;existe pas, plusieurs options s&rsquo;offrent \u00e0 vous\u00a0:<\/p>\n<ol>\n<li>Lancer une exception,<\/li>\n<li>Attraper une exception,<\/li>\n<li>Affichez votre propre message d&rsquo;erreur,<\/li>\n<li>Ou une autre option que je pourrais envisager dans cet article.<\/li>\n<\/ol>\n<p>Quoi qu&rsquo;il en soit, l&rsquo;id\u00e9e est d&rsquo;\u00eatre d\u00e9fensif dans votre code afin que vous puissiez vous pr\u00e9parer au cas o\u00f9 un fichier n&rsquo;existe pas et que vous puissiez g\u00e9rer l&rsquo;\u00e9chec avec \u00e9l\u00e9gance.<\/p>\n<h3>Sur le chargement automatique<\/h3>\n<p>Avant de conclure, il est important de noter ce qui suit\u00a0:<\/p>\n<ul>\n<li>Tout au long de l&rsquo;exemple, nous avons utilis\u00e9 du code orient\u00e9 objet lors de l&rsquo;espacement des noms du code. Apr\u00e8s tout, c&rsquo;est un concept orient\u00e9 objet.<\/li>\n<li>Notre chargeur automatique est \u00e9crit en code proc\u00e9dural. Ce qui donne?<\/li>\n<\/ul>\n<p>En fin de compte, cela a \u00e0 voir avec la biblioth\u00e8que PHP standard. Vous pouvez \u00e9crire un chargeur automatique orient\u00e9 objet, mais je pense que c&rsquo;est un peu exag\u00e9r\u00e9 dans de nombreux cas.<\/p>\n<p>Le processus de chargement d&rsquo;un fichier est un processus \u00e9tape par \u00e9tape, il est donc naturel de l&rsquo;\u00e9crire de mani\u00e8re proc\u00e9durale.<\/p>\n<p>Enfin, d&rsquo;autres peuvent choisir d&rsquo;utiliser des outils tels que Composer pour apporter des d\u00e9pendances. Ce sont d&rsquo;excellents outils, et il y a beaucoup d&rsquo;avantages \u00e0 utiliser quelque chose comme \u00e7a ; cependant, cela d\u00e9passe les concepts et les sujets de cet article et il vaut mieux le laisser pour une future discussion.<\/p>\n<h2>Ressources (et merci\u00a0!)<\/h2>\n<p>Cela a \u00e9t\u00e9 l&rsquo;un des articles les plus longs que j&rsquo;ai \u00e9crits pour mon site.<\/p>\n<p>C&rsquo;est en partie parce qu&rsquo;il est bas\u00e9 sur une conf\u00e9rence pour un WordCamp et aussi parce que je veux m&rsquo;assurer que je fournis une introduction et une base solides o\u00f9 vous pouvez commencer \u00e0 incorporer des espaces de noms et \u00e0 charger automatiquement dans vos plugins WordPress.<\/p>\n<p>En plus de cet article, j&rsquo;ai \u00e9galement fourni les ressources suivantes\u00a0:<\/p>\n<ul>\n<li>Les slides de ma pr\u00e9sentation sont <a href=\"https:\/\/speakerdeck.com\/tommcfarlin\/namespaces-and-autoloading-improving-wordpress-plugin-architecture\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">disponibles sur SpeakerDeck<\/a>.<\/li>\n<li>J&rsquo;ai le code de cette pr\u00e9sentation disponible <a href=\"https:\/\/github.com\/tommcfarlin\/namespaces-and-autoloading-in-wordpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">en t\u00e9l\u00e9chargement sur GitHub<\/a>.<\/li>\n<\/ul>\n<p>Et avec cela, j&rsquo;esp\u00e8re que cela fournit une introduction solide aux espaces de noms et au chargement automatique et que vous pourrez commencer \u00e0 incorporer cela de plus en plus dans votre travail. Cela profite grandement \u00e0 votre travail et aux autres d\u00e9veloppeurs qui pourraient \u00e9galement utiliser votre travail.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bas\u00e9 sur ma pr\u00e9sentation au WordCamp Atlanta 2017, voici mon article complet sur les espaces de noms et le chargement automatique dans le d\u00e9veloppement WordPress.<\/p>\n","protected":false},"author":1,"featured_media":221177,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,841,862],"tags":[1167],"class_list":["post-229222","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/229222","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=229222"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/229222\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/221177"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=229222"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=229222"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=229222"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}