Använda namnområden och autoloading i WordPress-plugins, del 4

Om det här är den första handledningen som du läser i den här serien, rekommenderar jag starkt att ta reda på vad vi hittills har täckt.

I huvudsak kommer du in i slutet av showen. Vid denna tidpunkt har vi lagt grunden för vårt plugin, skrivet plugin och definierade och utforskade namnområden och autoloaders. Allt som är kvar är att tillämpa det vi har lärt oss.

Så i den här handledningen kommer vi att sätta alla bitar ihop. Specifikt kommer vi att se källkoden för vårt plugin, namnrymden alla relevanta klasser och skriva en autoloader så att vi kan ta bort alla våra inkluderade uttalanden.

Jag kommer att diskutera allt i detalj när vi arbetar genom koden. Återigen, om det här är den första handledningen du läser i denna serie, ta reda på vad vi har täckt så långt och återvänd sedan till den här handledningen.

Innan vi skriver någon kod

Vid denna punkt borde du vara bekant med hur vi har skapat vår utvecklingsmiljö. Som en uppdatering är här en snabb översikt över programvaran vi använder:

  • åtminstone PHP 5,6.20
  • Apache webbservern
  • en MySQL-databasserver
  • WordPress 4.6.1
  • en fungerande kunskap om WordPress Plugin API

Du behöver också en kopia av källkoden i pluginet som vi arbetar med. Du kan ta en kopia av den här. Om vi ​​antar att den är installerad, aktiverad och du har din IDE igång, låt oss börja.

Namespacing koden

Minns från den tidigare handledningen, är jag en fan av att se till att våra namnområden följer organisationen av filerna på disken. Om du tittar på katalogstrukturen i vårt plugin eller om du har följt med serien hittills borde du se något så här:

Observera att om du har konfigurerat ditt plugin annorlunda är det bra. Dina namnområden kommer sannolikt att vara olika, men det borde inte påverka något som omfattas av denna serie.

Med hjälp av katalogstrukturen som riktlinje, låt oss gå igenom alla de PHP-filer som utgör vårt plugin och definiera deras namnområden. Det här är enkelt: Det handlar helt enkelt om att använda navigeringsordet och placera ett kvalificerat namn överst på varje fil.

Jag listar var och en nedan.

tutsplus-namespace-demo.php

klass-meta-box.php

klass-meta-box-display.php

gränssnitt-assets.php

klass-css-loader.php

klass-fråga-reader.php

Det finns några saker att märka om de konventioner som jag har använt ovan:

  • Rotenamnrymden är Tutsplus_Namespace_Demo, vilket motsvarar pluginets katalognamn.
  • Resten av namnområdena som Tutsplus_Namespace_Demo \ Admin och Tutsplus_Namespace_Demo \ Admin \ Util motsvarar också deras respektive kataloger; katalognamnen är emellertid cased (mot att vara i små bokstäver).

Slutligen, om du har försökt att uppdatera sidan eller du har försökt navigera runt WordPress sedan du har tagit in namnrapporterna, ser du sannolikt ett fel i konsolen som ser något ut så här:

Och det innehåller följande meddelande:

PHP Varning: call_user_func_array () förväntar sig att parameter 1 är en giltig återuppringning, funktion 'tutsplus_namespace_demo' inte hittad eller ogiltigt funktionsnamn i /Users/tommcfarlin/Dropbox/Projects/tutsplus/wp-includes/plugin.php på rad 524

Eller kanske det visar:

PHP Felaktigt fel: Klass "Meta_Box" finns inte i /Users/tommcfarlin/Dropbox/Projects/tutsplus/wp-content/plugins/tutsplus-namespace-demo/tutsplus-namespace-demo.php på rad 48

Eller så får du se några andra liknande felmeddelanden. Det är okej. Det är normalt.

Men det väcker frågan: Vad händer med vårt plugin? Lyckligtvis inget. Detta är förväntat beteende.

Det första meddelandet som du ser Maj vara ett resultat av ett annat plugin som du har installerat. Jag kunde inte reproducera det själv; Men när jag avaktiverar några av de andra plugins som jag har kört, skapade plugin det andra meddelandet (vilket är det meddelande jag ville visa).

När du namespace code, förväntar PHP att hitta en klass inom en given namnrymd. Konceptuellt kan du tänka på dina klasser som nu tillhör sitt eget paket (eller delpaket) eller hur du definierar det. Och för att en funktion ska kunna komma åt en klass inom ett paket måste den vara medveten om de paket som finns.

Det här är där ytterligare namnrymdsfunktionalitet och autoloading kommer till spel. Så innan vi försöker komma åt vår kod via deras namnområden, låt oss arbeta på en autoloader.

Allt om autoloading

Att skriva en autoloader kräver följande:

  1. förstå en PHP-funktion som heter spl_autoload_register
  2. skriver en funktion som automatiskt laddar våra namespaced-filer
  3. inklusive vår egen autoloading funktion

Låt inte namnet spl_autoload_register skrämma dig. Det betyder helt enkelt att det här är en funktion som ingår i "Standard PHP Library" och det är hur vi registrerar en "autoload" -funktion. Det är en muntlig att säga och många tecken att skriva, men det är bara en funktion som vi ska använda för att berätta för PHP hur man analyserar namnområden och klassnamn och var det kan hitta våra filer.

Den här funktionen gör det möjligt för oss att skriva vår egen anpassade kod för autoloading-filer och sedan ansluta nämnda funktion till PHP. Det vill säga, vi kommer att berätta för PHP var att hitta våra filer och hur man analyserar namnområden, filnamn etc. så att det kommer att inkludera filerna.

Med allt det sagt är vi redo att faktiskt skriva en autoloader.

Skriva en autoloader

När du skriver en autoloader är den sak att tänka på hur våra filer är organiserade. Det vill säga, vi vill veta hur man kartlägger våra namnområden till våra kataloger. 

I det exempel vi använder är det enkelt: Namnrymdena är förkortade versioner av katalogstrukturen. Detta gäller inte alltid för andra projekt. Det är dock ytterligare en anledning till att jag logiskt organiserar mina filer baserat på deras fysiska plats.

När PHP försöker ladda en klass måste vår autoloader behöva göra följande:

  1. Dela upp navnefältet baserat på snedstreck.
  2. Dela paketet och underpackningarna upp baserat på underskrifter och ersätt dem med bindestreck (om nödvändigt).
  3. Vet hur man kartlägger klassnamn, gränssnitt och så vidare till filnamn.
  4. Skapa en strängrepresentation av filnamnet baserat på ovanstående information.
  5. Inkludera filen.

Med alla de poäng som gjorts har vi vårt arbete skurit ut för oss. I plugin-katalogen skapar du en underkatalog som heter inc, och i inc katalog skapa en fil som heter autoload.php.

Inom den filen, låt oss fortsätta och stubba ut den funktion som vi ska använda för att autoload våra filer. Det borde se ut så här:

Självklart gör detta inte någonting än.

En sidoanmärkning om att skriva en autoloader

Observera att jag ska skriva kod och kodkommentarer för att förklara vad vi gör. Om du bara vågar in på det här självt för första gången kan det vara lite frustrerande att skriva en autoloader tillsammans med att använda namnområden och arbeta med filer. Det är här en debugger och loggfiler kan komma till nytta. 

Det här ligger utanför ramen för denna handledning, men vet att det är inte något du kan få rätt att skriva en autoloader första gången du gör det.

Slutför Autoloader

Låt oss börja lägga till lite funktionalitet med de steg som anges i början av det här avsnittet.

Först måste vi konfigurera en slinga som kommer att iterera bakåt genom de delar av filnamnet som överförs till autoloading-funktionen. Vi gör det eftersom det gör det enklare att bygga en sökväg till filen till autoload.

 0; $ i--) // Mer att komma ... 

Efter det måste vi titta på $ file_parts och ersätt alla förekomster av understrecket med en bindestreck eftersom alla våra klassnamn och gränssnittsanvändning understryks medan våra filnamn använder bindestreck.

Följande två linjer är de två första linjerna i slingan som vi stubbar ut ovan:

Nästa, vi kommer att behöva en villkorlig som gör några saker.

  1. Det måste kontrolleras för att se vilken post av sökvägen för filnamnet som vi läser.
  2. Om vi ​​är på första posten, så är vi på filnamnet; annars ligger vi på dess namnrymd.
  3. Nästa, om vi läser den första posten måste vi avgöra om vi försöker autoload ett gränssnitt eller vi laddar en klass.
  4. Om det är det förstnämnda måste vi justera namnet på gränssnittet så att vi laddar det korrekt baserat på filnamnet. Annars laddar vi klassen baserat på värdet i $ ström variabel.

Det läser som mycket, men det borde inte vara hemskt komplicerat att läsa. Se kommenterad kod nedan:

Med det gjort är det dags att bygga en fullt kvalificerad sökväg till filen. Lyckligtvis är detta lite mer än grundläggande strängkonstruktion:

Slutligen måste vi se till att filen finns. Om inte, visar vi ett vanligt WordPress-felmeddelande:

Och vid denna tidpunkt har vi en fullständig autoloader (som kan hämtas genom att ladda ner filerna från länken i sidofältet i det här inlägget eftersom källkoden skulle vara lite lång att posta här i handledningen).

Slutligen är det viktigt att notera att denna funktion kan (eller borde) skrivas om som en klass. Dessutom bör klassen bestå av flera mindre funktioner som kan testas, ha ett enda ansvar och läs tydligare än vad som är ovan. Kanske i en bonus handledning, jag går igenom processen av vad det skulle se ut.

Men vi innehåller fortfarande filer

Om du tittar nära toppen av huvud pluginfilen (eller bootstrap-filen som vi ofta har kallat den) märker du flera inkludera uttalanden som ser ut så här:

Med tanke på det arbete vi har gjort fram till den här tiden kan vi äntligen ta bort dessa uttalanden och ersätta dem med endast en:

För att vara tydlig ersätter vi den med vår autoloader. Vid denna tidpunkt borde vi göra med vårt plugin.

Få alltid att falla på plats

Nu när vi har namngiven vår kod för att tillhandahålla en logisk organisation av relaterade klasser och skrivit en autoloader för att automatiskt inkludera filer baserat på varje klasss namnrymd och filplats, borde vi kunna starta vårt plugin och få det att springa exakt som det gjorde under den första framgångsrika iterationen.

Det sista vi behöver göra är att se till att vi uppdaterar bootstrap-filen så att vi instruerar PHP att använda namespaces för Meta_Box, Meta_Box_Display, de Question_Reader, och den CSS_Loader.

i det(); $ Meta_box-> init (); 

Observera i koden ovan använder vi PHP använda sig av nyckelord, och vi prefixar våra klassnamn med sina omedelbara underpackningar. Du kan läsa mer om användningen i handboken, men kortfattat är det:

De använda sig av nyckelordet måste deklareras i den yttersta ramen för en fil (det globala räckviddet) eller inuti namnområdesdeklarationer. Detta beror på att importen är klar vid sammanställningstid och inte runtime, så det kan inte blockeras. 

Med det sagt och förutsatt att alla fungerar korrekt bör du kunna navigera till Lägg till ny post sida (eller Redigera inlägg) sidan, se vår meta-box och se en frågespel längst upp i sidofältet:

Om så är fallet, så grattis. Du har lyckats konfigurera ditt plugin till dina namnområden och autoladdning. Om inte, dubbelkoda koden mot vad vi har delat här, granska dina felloggar och se till att ingenting visas upp vanligt på WordPress-administrationsskärmen.

Om du do se något, oddsen är att det har att göra med något mindre. Granska koden som vi har täckt, jämföra den med vad som bifogas här till det här inlägget (i sidofältet tillsammans med den stora blå knappen) och se om du kan begränsa problemet.

Slutsats

Vid denna tidpunkt har vi nått slutet av vår serie. Under de senaste fyra handledningarna har vi täckt mycket av marken:

  • Vi har byggt ett plugin som uppmanar användare med frågor som hjälper till att starta sin bloggning.
  • Vi har använt PHP-funktioner för att läsa filer från filsystemet och återge det i teckenfönstret.
  • Vi har definierat namnområden och autoloading och tittat på hur de kan tillämpas.
  • Vi har organiserat vår kod och skrivit vår egen autoloader, vilket gör koden mer läsbar, organiserad och mindre rörig.

I slutändan kan mycket av det material som omfattas av denna serie användas i befintliga och framtida projekt som du kanske arbetar med. 

Kom ihåg att du också kan hitta andra WordPress-relaterade produkter i vår marknadsplats. Och om du vill lära dig mer om att utveckla lösningar för WordPress hittar du alla mina handledning och serier på min profilsida. Tveka inte att följa med mig på min blogg eller på Twitter när jag diskuterar mjukvaruutveckling i samband med WordPress nästan dagligen.

Och kom ihåg att länken är för nedladdning av den sista källkoden finns i sidofältet under en knapp med titeln Hämta bilagan. Naturligtvis tveka inte att ställa några frågor i kommentarerna!

Medel

  • spl_autoload_register
  • använda sig av