{"id":233898,"date":"2023-02-24T10:15:00","date_gmt":"2023-02-24T07:15:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233898"},"modified":"2022-11-11T13:04:11","modified_gmt":"2022-11-11T10:04:11","slug":"come-implementare-un-caricatore-automatico-con-spazi-dei-nomi-nel-tuo-tema-o-plug-in-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/come-implementare-un-caricatore-automatico-con-spazi-dei-nomi-nel-tuo-tema-o-plug-in-wordpress\/","title":{"rendered":"Come implementare un caricatore automatico con spazi dei nomi nel tuo tema o plug-in WordPress"},"content":{"rendered":"\n<p>Se stai scrivendo codice orientato agli oggetti, un caricatore automatico \u00e8 un must. Senza un caricatore automatico dovresti aggiungere una riga con incluso il file di classe, prima di poterlo inizializzare. Pu\u00f2 essere rapidamente ingombrante quando lavori con molte classi. Un caricatore automatico \u00e8 una funzione che si attiva ogni volta che viene istanziata una nuova classe e include il file di classe prima che avvenga l&#8217;istanza.<\/p>\n<p>Gli spazi dei nomi sono un modo per strutturare e incapsulare il codice e aiutano a evitare collisioni di nomi. Se hai intenzione di scrivere OOP, si consiglia di utilizzare anche gli spazi dei nomi. Tieni presente che puoi implementare un caricatore automatico senza utilizzare gli spazi dei nomi nel codice OOP.<\/p>\n<p>Puoi utilizzare questo codice per il tuo tema o plug-in WordPress o qualsiasi codice PHP al di fuori di WordPress: basta modificare i percorsi di conseguenza. Per questo esempio sto creando un caricatore automatico per un tema WordPress.<\/p>\n<h2>Regole per lo spazio dei nomi e la struttura delle classi<\/h2>\n<p>L&#8217;implementazione di un caricatore automatico richiederebbe alcune regole definite per la struttura del codice e dove trovarle. L&#8217;uso degli spazi dei nomi semplifica in qualche modo, poich\u00e9 il tuo spazio dei nomi pu\u00f2 fare riferimento a quale cartella si trovano le classi.<\/p>\n<p>Per prima cosa prendi una decisione su come deve essere chiamato il tuo spazio dei nomi. Di solito \u00e8 qualcosa di unico per il tuo codice, ad esempio il nome del tuo tema. Ad esempio, lo spazio dei nomi per il tema di questo sito \u00e8 <code>AWhitePixelTheme<\/code>. Ci\u00f2 significa che affinch\u00e9 il caricatore automatico funzioni, tutte le classi devono trovarsi all&#8217;interno di questo spazio dei nomi.<\/p>\n<pre><code>namespace AWhitePixelTheme;<\/code><\/pre>\n<p>La mia prima regola \u00e8 che qualsiasi file di classe conterr\u00e0 sempre solo una classe e il nome della classe deve essere lo stesso del nome del file. Per esempio; una classe <code>MyTest<\/code>deve essere definita all&#8217;interno di un file <code>MyTest.php<\/code>.<\/p>\n<p>La mia seconda regola \u00e8 come strutturare le classi in cartelle. Decido che tutte le classi vadano all&#8217;interno di una cartella <code>src<\/code>nel mio tema. Posso inserire i file di classe direttamente in questa cartella e per questo devono trovarsi all&#8217;interno dello spazio dei nomi &quot;root&quot; definito sopra. Ma se voglio creare sottocartelle e inserirvi file di classe, i loro spazi dei nomi devono includere la struttura delle cartelle. Ad esempio una classe file <code>MyTest.php<\/code>che risiede nella cartella <code>src\/Test\/<\/code>, deve avere questo spazio dei nomi definito:<\/p>\n<pre><code>namespace AWhitePixelThemeTest;<\/code><\/pre>\n<h2>Creazione del caricatore automatico<\/h2>\n<p>Mi piace mantenere il caricatore automatico in un file separato e all&#8217;esterno della <code>src\/<\/code>cartella definita solo per i file di classe con spazio dei nomi. Ad esempio creer\u00f2 un file <code>autoloader.php<\/code>nella cartella <code>inc\/<\/code>nel mio tema.<\/p>\n<p>PHP ha una funzione di caricamento automatico incorporata: <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>. Fornisci il nome della funzione del caricatore automatico come parametro e in quella funzione ottieni la classe richiesta come argomento (quello che metti dopo <code>new<\/code>quando si crea un&#8217;istanza della classe). Quando si istanziano classi con spazi dei nomi, ad esempio <code>new AWhitePixelThemeTestMyTest()<\/code>, la variabile fornita a questa funzione sarebbe <code>\"AWhitePixelThemeTestMyTest\"<\/code>.<\/p>\n<p>Aggiungiamo la funzione di caricamento automatico e in essa definiamo il nostro spazio dei nomi richiesto per il caricatore automatico:<\/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>Quindi dobbiamo includere questo file in modo che il nostro caricatore automatico sia registrato. Poich\u00e9 questo \u00e8 in un tema, aggiunger\u00f2 l&#8217;inclusione nel tema <code>functions.php<\/code>. Se lo stai utilizzando per un plug-in, inseriscilo nei file del plug-in. Il file del caricatore automatico deve essere aggiunto in anticipo, prima di qualsiasi istanziazione delle classi. Lo metto alla prima riga del mio <code>functions.php<\/code>:<\/p>\n<pre><code>require_once(get_template_directory(). '\/inc\/autoloader.php');<\/code><\/pre>\n<p>Se lo stai utilizzando per un tema figlio o un plug-in, modifica il percorso in base alle tue esigenze.<\/p>\n<p>E questo \u00e8 tutto. Ora il caricatore automatico \u00e8 a posto, ma non sta facendo nulla. Torniamo alla funzione di caricamento automatico e finiamola.<\/p>\n<h2>Scrittura e test della funzione di caricamento automatico<\/h2>\n<p>Per prima cosa dobbiamo assicurarci che il nome della classe richiesta sia effettivamente all&#8217;interno del nostro spazio dei nomi. Verifichiamo semplicemente se il nome della classe dello spazio dei nomi fornito contiene la stringa dello spazio dei nomi e, in caso contrario, usciamo dalla funzione. Dopodich\u00e9 rimuoviamo il nome dello spazio dei nomi dalla stringa, in modo da poter elaborare eventuali sottocartelle e file di 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>Ora trasformeremo lo spazio dei nomi fornito in un percorso effettivo del file. Per prima cosa, sostituiremo qualsiasi barra rovesciata <code>\"\"<\/code>nello spazio dei nomi con il carattere per separatore di cartelle: per questo utilizziamo la costante PHP <code>DIRECTORY_SEPARATOR<\/code>. Alla fine aggiungiamo un <code>\".php\"<\/code>. E infine prima della stringa aggiungiamo il percorso radice completo. Poich\u00e9 questo \u00e8 all&#8217;interno di un tema, sto usando <code>get_template_directory()<\/code>. Se lo stai usando per un plugin, usa un metodo che restituisce il percorso completo del tuo 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>Tutto ci\u00f2 che dobbiamo fare ora \u00e8 verificare se il file esiste e, in tal caso, richiederlo.<\/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>Questo \u00e8 tutto!<\/p>\n<p>Proviamolo. Crea una sottocartella <code>Test<\/code>nella cartella del tuo tema <code>src\/<\/code>e al suo interno inserisci un file php chiamato <code>MyTest.php<\/code>. Definisci una classe <code>MyTest<\/code>al suo interno, seguendo le regole per lo spazio dei nomi: <code>AWhitePixelThemeTest<\/code>. Aggiunger\u00f2 semplicemente una stampa di &quot;Success&quot; nella funzione di costruzione in modo da poter vedere facilmente che inizializza effettivamente 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>Nel nostro functions.php, dopo aver richiesto il caricatore automatico, istanziamo semplicemente la classe:<\/p>\n<pre><code>$test = new AWhitePixelThemeTestMyTest();<\/code><\/pre>\n<p>Aggiorna il tuo sito WordPress e vedrai che ottieni il &quot;Success!&quot; emesso.<\/p>\n<p>Il caricatore automatico caricher\u00e0 automaticamente tutti i file di classe che si trovano all&#8217;interno del nostro spazio dei nomi definito e segue le regole corrette. Puoi creare un&#8217;istanza delle classi da qualsiasi punto all&#8217;interno del tuo tema, anche all&#8217;interno delle classi stesse.<\/p>\n<h2>La funzione di caricamento automatico completo<\/h2>\n<p>Per riferimento, ecco la nostra funzione di caricamento automatico finale:<\/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\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una guida su come scrivere un caricatore automatico che consenta gli spazi dei nomi per il codice orientato agli oggetti su un tema o plug-in 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":[918,896,896,720,835,918,1110,835,928,720,928,844,844,865,865],"tags":[1168],"class_list":["post-233898","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-altro","category-codice","category-sviluppatore","category-guida-per-principianti","category-n-a","category-soggetti","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233898","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=233898"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233898\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/224072"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=233898"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233898"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233898"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}