...
✅ Notizie, temi, plugin WEB e WordPress. Qui condividiamo suggerimenti e le migliori soluzioni per siti web.

Come implementare un caricatore automatico con spazi dei nomi nel tuo tema o plug-in WordPress

9

Se stai scrivendo codice orientato agli oggetti, un caricatore automatico è un must. Senza un caricatore automatico dovresti aggiungere una riga con incluso il file di classe, prima di poterlo inizializzare. Può essere rapidamente ingombrante quando lavori con molte classi. Un caricatore automatico è una funzione che si attiva ogni volta che viene istanziata una nuova classe e include il file di classe prima che avvenga l’istanza.

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.

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.

Regole per lo spazio dei nomi e la struttura delle classi

L’implementazione di un caricatore automatico richiederebbe alcune regole definite per la struttura del codice e dove trovarle. L’uso degli spazi dei nomi semplifica in qualche modo, poiché il tuo spazio dei nomi può fare riferimento a quale cartella si trovano le classi.

Per prima cosa prendi una decisione su come deve essere chiamato il tuo spazio dei nomi. Di solito è 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 è AWhitePixelTheme. Ciò significa che affinché il caricatore automatico funzioni, tutte le classi devono trovarsi all’interno di questo spazio dei nomi.

namespace AWhitePixelTheme;

La mia prima regola è che qualsiasi file di classe conterrà sempre solo una classe e il nome della classe deve essere lo stesso del nome del file. Per esempio; una classe MyTestdeve essere definita all’interno di un file MyTest.php.

La mia seconda regola è come strutturare le classi in cartelle. Decido che tutte le classi vadano all’interno di una cartella srcnel mio tema. Posso inserire i file di classe direttamente in questa cartella e per questo devono trovarsi all’interno dello spazio dei nomi "root" 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 MyTest.phpche risiede nella cartella src/Test/, deve avere questo spazio dei nomi definito:

namespace AWhitePixelThemeTest;

Creazione del caricatore automatico

Mi piace mantenere il caricatore automatico in un file separato e all’esterno della src/cartella definita solo per i file di classe con spazio dei nomi. Ad esempio creerò un file autoloader.phpnella cartella inc/nel mio tema.

PHP ha una funzione di caricamento automatico incorporata: spl_autoload_register. Fornisci il nome della funzione del caricatore automatico come parametro e in quella funzione ottieni la classe richiesta come argomento (quello che metti dopo newquando si crea un’istanza della classe). Quando si istanziano classi con spazi dei nomi, ad esempio new AWhitePixelThemeTestMyTest(), la variabile fornita a questa funzione sarebbe "AWhitePixelThemeTestMyTest".

Aggiungiamo la funzione di caricamento automatico e in essa definiamo il nostro spazio dei nomi richiesto per il caricatore automatico:

Quindi dobbiamo includere questo file in modo che il nostro caricatore automatico sia registrato. Poiché questo è in un tema, aggiungerò l’inclusione nel tema functions.php. 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 functions.php:

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

Se lo stai utilizzando per un tema figlio o un plug-in, modifica il percorso in base alle tue esigenze.

E questo è tutto. Ora il caricatore automatico è a posto, ma non sta facendo nulla. Torniamo alla funzione di caricamento automatico e finiamola.

Scrittura e test della funzione di caricamento automatico

Per prima cosa dobbiamo assicurarci che il nome della classe richiesta sia effettivamente all’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é rimuoviamo il nome dello spazio dei nomi dalla stringa, in modo da poter elaborare eventuali sottocartelle e file di classe.

Ora trasformeremo lo spazio dei nomi fornito in un percorso effettivo del file. Per prima cosa, sostituiremo qualsiasi barra rovesciata ""nello spazio dei nomi con il carattere per separatore di cartelle: per questo utilizziamo la costante PHP DIRECTORY_SEPARATOR. Alla fine aggiungiamo un ".php". E infine prima della stringa aggiungiamo il percorso radice completo. Poiché questo è all’interno di un tema, sto usando get_template_directory(). Se lo stai usando per un plugin, usa un metodo che restituisce il percorso completo del tuo 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; }

Tutto ciò che dobbiamo fare ora è verificare se il file esiste e, in tal caso, richiederlo.

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

Questo è tutto!

Proviamolo. Crea una sottocartella Testnella cartella del tuo tema src/e al suo interno inserisci un file php chiamato MyTest.php. Definisci una classe MyTestal suo interno, seguendo le regole per lo spazio dei nomi: AWhitePixelThemeTest. Aggiungerò semplicemente una stampa di "Success" nella funzione di costruzione in modo da poter vedere facilmente che inizializza effettivamente la classe.

Nel nostro functions.php, dopo aver richiesto il caricatore automatico, istanziamo semplicemente la classe:

$test = new AWhitePixelThemeTestMyTest();

Aggiorna il tuo sito WordPress e vedrai che ottieni il "Success!" emesso.

Il caricatore automatico caricherà automaticamente tutti i file di classe che si trovano all’interno del nostro spazio dei nomi definito e segue le regole corrette. Puoi creare un’istanza delle classi da qualsiasi punto all’interno del tuo tema, anche all’interno delle classi stesse.

La funzione di caricamento automatico completo

Per riferimento, ecco la nostra funzione di caricamento automatico finale:

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); } }

Fonte di registrazione: 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