✅ WEB- och WordPress -nyheter, teman, plugins. Här delar vi tips och bästa webbplatslösningar.

Hur man implementerar en autoloader med namnutrymmen i ditt WordPress-tema eller plugin

9

Om du skriver objektorienterad kod är en autoloader ett måste. Utan en autoloader skulle du behöva lägga till en rad med att inkludera klassfilen, innan du kan initiera den. Det kan snabbt bli krångligt när man jobbar med många klasser. En autoloader är en funktion som utlöses varje gång en ny klass instansieras och inkluderar klassfilen innan instansieringen sker.

Namnutrymmen är ett sätt att strukturera och kapsla in din kod och hjälper till att undvika namnkollisioner. Om du ska skriva OOP rekommenderas det att du också använder namnrymder. Tänk på att du kan implementera en autoloader utan att använda namnutrymmen i din OOP-kod.

Du kan använda den här koden för ditt WordPress-tema eller plugin, eller vilken PHP-kod som helst utanför WordPress för den delen – ändra bara sökvägarna på motsvarande sätt. För det här exemplet skapar jag en autoloader för ett WordPress-tema.

Regler för klassnamnutrymme och struktur

Att implementera en autoloader skulle kräva vissa definierade regler för din kodstruktur och var man kan hitta dem. Att använda namnutrymmen förenklar detta något, eftersom ditt namnområde kan referera till vilken mapp klasserna finns i.

Ta först ett beslut om vad ditt namnområde ska heta. Vanligtvis är det något unikt för din kod, till exempel ditt temanamn. Till exempel är namnutrymmet för den här webbplatsens tema AWhitePixelTheme. Det betyder att för att autoloadern ska fungera måste alla klasser finnas inom detta namnutrymme.

namespace AWhitePixelTheme;

Min första regel är att alla klassfiler alltid bara innehåller en klass, och klassnamnet måste vara detsamma som filnamnet. Till exempel; en klass MyTestmåste definieras i en fil MyTest.php.

Min andra regel är hur man strukturerar klasserna i mappar. Jag bestämmer mig för att alla klasser hamnar i en mapp srci mitt tema. Jag kan lägga klassfiler direkt i den här mappen, och för det måste de finnas i "root"-namnutrymmet som definierats ovan. Men om jag vill skapa undermappar och lägga in klassfiler i dem, måste deras namnområden inkludera mappstrukturen. Till exempel en klass fil MyTest.phpsom finns i mappen src/Test/måste ha detta namnområde definierat:

namespace AWhitePixelThemeTest;

Skapar autoloader

Jag gillar att hålla autoloadern i en separat fil och utanför src/mappen som endast är definierad för namnavgränsade klassfiler. Som ett exempel ska jag skapa en fil autoloader.phpi mappen inc/i mitt tema.

PHP har en inbyggd autoloader-funktion: spl_autoload_register. Du anger ditt autoloader-funktionsnamn som parameter, och i den funktionen får du den begärda klassen som argument (det du sätter efter newnär du instansierar klassen). När du instansierar klasser med namnutrymmen, t.ex. new AWhitePixelThemeTestMyTest(), skulle den tillhandahållna variabeln för denna funktion vara "AWhitePixelThemeTestMyTest".

Låt oss lägga till autoloader-funktionen, och i den definierar vi vårt nödvändiga namnutrymme för autoloader:

Sedan måste vi inkludera den här filen så att vår autoloader registreras. Eftersom detta är i ett tema kommer jag att lägga till inkluderingen i temats functions.php. Om du använder detta för ett plugin, lägg det i dina plugin-filer. Autoloader-filen måste läggas till tidigt, innan någon instansiering av klasser. Jag sätter detta på den allra första raden i min functions.php:

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

Om du använder det för ett barntema eller ett plugin, ändra sökvägen för dina behov.

Och det är allt. Nu är autoloadern på plats, men den gör ingenting. Låt oss återgå till autoloader-funktionen och avsluta den.

Skriver och testar autoloader-funktionen

Först måste vi se till att det begärda klassnamnet faktiskt finns i vårt namnområde. Vi kontrollerar helt enkelt om namnområdets klassnamn som tillhandahålls innehåller namnområdessträngen, och om inte, avslutar vi funktionen. Efter det tar vi bort namnområdets namn från strängen, så att vi kan räkna ut alla undermappar och klassfiler.

Nu kommer vi att omvandla det angivna namnområdet till en faktisk sökväg till filen. Först kommer vi att ersätta eventuellt omvänt snedstreck ""i namnutrymmet med tecknet för mappavgränsare – för detta använder vi PHP-konstanten DIRECTORY_SEPARATOR. I slutet lägger vi till en ".php". Och slutligen före strängen lägger vi till hela rotbanan. Eftersom det här är inom ett tema använder jag get_template_directory(). Om du använder detta för ett plugin, använd en metod som returnerar hela sökvägen till din 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; }

Allt vi behöver göra nu är att kontrollera om filen finns, och om den gör det, kräver den.

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

Det är allt!

Låt oss testa det. Skapa en undermapp Testi ditt temas src/mapp och lägg in en php-fil med namnet MyTest.php. Definiera en klass MyTesti den, följ reglerna för namnutrymme: AWhitePixelThemeTest. Jag lägger bara till en utskrift av "Success" i konstruktionsfunktionen så att vi enkelt kan se att den faktiskt initierar klassen.

I vår functions.php, efter att ha krävt autoloader, instansierar vi helt enkelt klassen:

$test = new AWhitePixelThemeTestMyTest();

Uppdatera din WordPress-webbplats och se att du får "Framgång!" matas ut.

Autoloadern kommer att autoladda alla klassfiler som finns inom vårt definierade namnområde och följer de korrekta reglerna. Du kan instansiera klasser från var som helst inom ditt tema, även inuti själva klasserna.

Den fullständiga autoloader-funktionen

För referens, här är vår sista autoloader-funktion:

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

Inspelningskälla: awhitepixel.com

Denna webbplats använder cookies för att förbättra din upplevelse. Vi antar att du är ok med detta, men du kan välja bort det om du vill. Jag accepterar Fler detaljer