{"id":234263,"date":"2023-02-24T09:56:00","date_gmt":"2023-02-24T06:56:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234263"},"modified":"2022-11-12T02:45:30","modified_gmt":"2022-11-11T23:45:30","slug":"comment-implementer-un-chargeur-automatique-avec-des-espaces-de-noms-dans-votre-theme-ou-plugin-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/comment-implementer-un-chargeur-automatique-avec-des-espaces-de-noms-dans-votre-theme-ou-plugin-wordpress\/","title":{"rendered":"Comment impl\u00e9menter un chargeur automatique avec des espaces de noms dans votre th\u00e8me ou plugin WordPress"},"content":{"rendered":"\n<p>Si vous \u00e9crivez du code orient\u00e9 objet, un chargeur automatique est indispensable. Sans chargeur automatique, vous auriez besoin d&rsquo;ajouter une ligne avec le fichier de classe avant de pouvoir l&rsquo;initialiser. Cela peut vite \u00eatre fastidieux quand on travaille avec beaucoup de classes. Un chargeur automatique est une fonction qui se d\u00e9clenche \u00e0 chaque fois qu&rsquo;une nouvelle classe est instanci\u00e9e et inclut le fichier de classe avant que l&rsquo;instanciation ne se produise.<\/p>\n<p>Les espaces de noms sont un moyen de structurer et d&rsquo;encapsuler votre code, et aident \u00e0 \u00e9viter les collisions de noms. Si vous allez \u00e9crire de la POO, il est \u00e9galement recommand\u00e9 d&rsquo;utiliser des espaces de noms. Gardez \u00e0 l&rsquo;esprit que vous pouvez impl\u00e9menter un chargeur automatique sans utiliser d&rsquo;espaces de noms dans votre code OOP.<\/p>\n<p>Vous pouvez utiliser ce code pour votre th\u00e8me ou plugin WordPress, ou tout code PHP en dehors de WordPress d&rsquo;ailleurs &#8211; modifiez simplement les chemins en cons\u00e9quence. Pour cet exemple, je cr\u00e9e un chargeur automatique pour un th\u00e8me WordPress.<\/p>\n<h2>R\u00e8gles pour l&rsquo;espace de noms et la structure des classes<\/h2>\n<p>L&rsquo;impl\u00e9mentation d&rsquo;un chargeur automatique n\u00e9cessiterait des r\u00e8gles d\u00e9finies pour votre structure de code et o\u00f9 les trouver. L&rsquo;utilisation d&rsquo;espaces de noms simplifie quelque peu cela, car votre espace de noms peut faire r\u00e9f\u00e9rence au dossier dans lequel se trouvent les classes.<\/p>\n<p>D\u00e9cidez d&rsquo;abord du nom de votre espace de noms. Habituellement, c&rsquo;est quelque chose d&rsquo;unique pour votre code, par exemple le nom de votre th\u00e8me. Par exemple, l&rsquo;espace de noms pour le th\u00e8me de ce site est <code>AWhitePixelTheme<\/code>. Cela signifie que pour que le chargeur automatique fonctionne, toutes les classes doivent se trouver dans cet espace de noms.<\/p>\n<pre><code>namespace AWhitePixelTheme;<\/code><\/pre>\n<p>Ma premi\u00e8re r\u00e8gle est que tout fichier de classe ne contiendra toujours qu&rsquo;une seule classe et que le nom de la classe doit \u00eatre le m\u00eame que le nom du fichier. Par exemple; une classe <code>MyTest<\/code>doit \u00eatre d\u00e9finie dans un fichier <code>MyTest.php<\/code>.<\/p>\n<p>Ma deuxi\u00e8me r\u00e8gle est de savoir comment structurer les classes dans des dossiers. Je d\u00e9cide que toutes les classes vont dans un dossier <code>src<\/code>de mon th\u00e8me. Je peux mettre des fichiers de classe directement dans ce dossier, et pour cela ils doivent \u00eatre \u00e0 l&rsquo;int\u00e9rieur de l&rsquo;espace de noms &quot;racine&quot; d\u00e9fini ci-dessus. Mais si je veux cr\u00e9er 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 <code>MyTest.php<\/code>qui r\u00e9side dans le dossier <code>src\/Test\/<\/code>, doit avoir cet espace de noms d\u00e9fini\u00a0:<\/p>\n<pre><code>namespace AWhitePixelThemeTest;<\/code><\/pre>\n<h2>Cr\u00e9ation du chargeur automatique<\/h2>\n<p>J&rsquo;aime conserver le chargeur automatique dans un fichier s\u00e9par\u00e9 et en dehors du <code>src\/<\/code>dossier d\u00e9fini uniquement pour les fichiers de classe \u00e0 espace de noms. Par exemple, je vais cr\u00e9er un fichier <code>autoloader.php<\/code>dans le dossier <code>inc\/<\/code>de mon th\u00e8me.<\/p>\n<p>PHP a une fonction de chargement automatique int\u00e9gr\u00e9e: <a href=\"https:\/\/www.php.net\/manual\/en\/function.spl-autoload-register.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">spl_autoload_register<\/a>. Vous fournissez le nom de votre fonction de chargement automatique en tant que param\u00e8tre, et dans cette fonction, vous obtenez la classe demand\u00e9e en tant qu&rsquo;argument (ce que vous mettez apr\u00e8s <code>new<\/code>lors de l&rsquo;instanciation de la classe). Lors de l&rsquo;instanciation de classes avec des espaces de noms, par exemple <code>new AWhitePixelThemeTestMyTest()<\/code>, la variable fournie \u00e0 cette fonction serait <code>\"AWhitePixelThemeTestMyTest\"<\/code>.<\/p>\n<p>Ajoutons la fonction autoloader, et nous y d\u00e9finissons notre espace de noms requis pour l&rsquo;autoloader\u00a0:<\/p>\n<pre><code>&lt;?php\nspl_autoload_register('awhitepixel_autoloader');\nfunction awhitepixel_autoloader($class) {\n    $namespace = 'AWhitePixelTheme';\n\u00a0\n}<\/code><\/pre>\n<p>Ensuite, nous devons inclure ce fichier afin que notre chargeur automatique soit enregistr\u00e9. Comme c&rsquo;est dans un th\u00e8me, je vais ajouter l&rsquo;include dans le fichier <code>functions.php<\/code>. Si vous l&rsquo;utilisez pour un plugin, placez-le dans vos fichiers de plugin. Le fichier de chargement automatique doit \u00eatre ajout\u00e9 t\u00f4t, avant toute instanciation de classes. Je mets ceci \u00e0 la toute premi\u00e8re ligne de mon <code>functions.php<\/code>:<\/p>\n<pre><code>require_once(get_template_directory(). '\/inc\/autoloader.php');<\/code><\/pre>\n<p>Si vous l&rsquo;utilisez pour un th\u00e8me enfant ou un plugin, modifiez le chemin selon vos besoins.<\/p>\n<p>Et c&rsquo;est tout. Maintenant, le chargeur automatique est en place, mais il ne fait rien. Revenons \u00e0 la fonction de chargement automatique et terminons-la.<\/p>\n<h2>Ecrire et tester la fonction de chargement automatique<\/h2>\n<p>Nous devons d&rsquo;abord nous assurer que le nom de classe demand\u00e9 se trouve bien dans notre espace de noms. Nous v\u00e9rifions simplement si le nom de classe d&rsquo;espace de noms fourni contient la cha\u00eene d&rsquo;espace de noms, et si ce n&rsquo;est pas le cas, nous quittons la fonction. Apr\u00e8s cela, nous supprimons le nom de l&rsquo;espace de noms de la cha\u00eene, afin que nous puissions travailler sur tous les sous-dossiers et fichiers de classe.<\/p>\n<pre><code>&lt;?php\nspl_autoload_register('awhitepixel_autoloader');\nfunction awhitepixel_autoloader($class) {\n    $namespace_name = 'AWhitePixelTheme';\n\u00a0\n    if (strpos($class, $namespace) !== 0) {\n        return;\n    }\n    $class = str_replace($namespace, '', $class);\n}<\/code><\/pre>\n<p>Nous allons maintenant transformer l&rsquo;espace de noms fourni en un v\u00e9ritable chemin d&rsquo;acc\u00e8s au fichier. Tout d&rsquo;abord, nous remplacerons toute barre oblique inverse <code>\"\"<\/code>dans l&rsquo;espace de noms par le caract\u00e8re du s\u00e9parateur de dossier &#8211; pour cela, nous utilisons la constante PHP <code>DIRECTORY_SEPARATOR<\/code>. \u00c0 la toute fin, nous ajoutons un <code>\".php\"<\/code>. Et enfin avant la cha\u00eene, nous ajoutons le chemin racine complet. Parce que c&rsquo;est \u00e0 l&rsquo;int\u00e9rieur d&rsquo;un th\u00e8me, j&rsquo;utilise <code>get_template_directory()<\/code>. Si vous l&rsquo;utilisez pour un plugin, utilisez une m\u00e9thode qui renvoie le chemin complet de votre plugin.<\/p>\n<pre><code>    ...\n    $class = str_replace($namespace, '', $class);\n\u00a0\n    $class = str_replace('', DIRECTORY_SEPARATOR, $class). '.php';\n    $directory = get_template_directory();\n    $path = $directory. DIRECTORY_SEPARATOR. 'src'. DIRECTORY_SEPARATOR. $class;\n}<\/code><\/pre>\n<p>Tout ce que nous devons faire maintenant est de v\u00e9rifier si le fichier existe et, si c&rsquo;est le cas, de l&rsquo;exiger.<\/p>\n<pre><code>    ...\n    $path = $directory. DIRECTORY_SEPARATOR. 'src'. DIRECTORY_SEPARATOR. $class;\n\u00a0\n    if (file_exists($path)) {\n        require_once($path);\n    }\n}<\/code><\/pre>\n<p>C&rsquo;est \u00e7a!<\/p>\n<p>Testons-le. Cr\u00e9ez un sous-dossier <code>Test<\/code>dans le dossier de votre th\u00e8me <code>src\/<\/code>et placez-y un fichier php nomm\u00e9 <code>MyTest.php<\/code>. D\u00e9finissez- <code>MyTest<\/code>y une classe en suivant les r\u00e8gles de l&rsquo;espace de noms\u00a0: <code>AWhitePixelThemeTest<\/code>. Je vais juste ajouter une impression de &lsquo;Success&rsquo; dans la fonction de construction afin que nous puissions facilement voir qu&rsquo;elle initialise r\u00e9ellement la classe.<\/p>\n<pre><code>&lt;?php\nnamespace AWhitePixelThemeTest;\n\u00a0\nclass MyTest {\n    public function __construct() {\n        var_dump('Success!');\n    }\n}<\/code><\/pre>\n<p>Dans notre functions.php, apr\u00e8s avoir demand\u00e9 l&rsquo;autoloader, nous instancions simplement la classe\u00a0:<\/p>\n<pre><code>$test = new AWhitePixelThemeTestMyTest();<\/code><\/pre>\n<p>Actualisez votre site WordPress et constatez que vous obtenez le \u00ab\u00a0Succ\u00e8s\u00a0!\u00a0\u00bb sortie.<\/p>\n<p>Le chargeur automatique chargera automatiquement tous les fichiers de classe qui se trouvent dans notre espace de noms d\u00e9fini et suivra les r\u00e8gles correctes. Vous pouvez instancier des classes depuis n&rsquo;importe o\u00f9 dans votre th\u00e8me, m\u00eame \u00e0 l&rsquo;int\u00e9rieur des classes elles-m\u00eames.<\/p>\n<h2>La fonction compl\u00e8te de chargeur automatique<\/h2>\n<p>Pour r\u00e9f\u00e9rence, voici notre derni\u00e8re fonction de chargement automatique\u00a0:<\/p>\n<pre><code>spl_autoload_register('awhitepixel_autoloader');\nfunction awhitepixel_autoloader($class) {\n    $namespace = 'AWhitePixelTheme';\n\u00a0\n    if (strpos($class, $namespace) !== 0) {\n        return;\n    }\n\u00a0\n    $class = str_replace($namespace, '', $class);\n    $class = str_replace('', DIRECTORY_SEPARATOR, $class). '.php';\n\u00a0\n    $directory = get_template_directory();\n    $path = $directory. DIRECTORY_SEPARATOR. 'src'. DIRECTORY_SEPARATOR. $class;\n\u00a0\n    if (file_exists($path)) {\n        require_once($path);\n    }\n}<\/code><\/pre>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un guide sur la fa\u00e7on d&rsquo;\u00e9crire un chargeur automatique permettant des espaces de noms pour votre code orient\u00e9 objet vers un th\u00e8me ou un plugin WordPress.<\/p>\n","protected":false},"author":1,"featured_media":224072,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[915,893,893,717,717,832,915,1110,832,925,925,841,841,862,862],"tags":[1167],"class_list":["post-234263","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-autre","category-code-2","category-developpeur","category-guide-pour-les-debutants","category-n-a","category-sujets","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234263","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=234263"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234263\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/224072"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=234263"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=234263"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=234263"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}