Objektorienterad autoladdning i WordPress, del 3

I den senaste handledningen granskade vi vår autoloaders ursprungliga tillstånd och gick sedan igenom en process med objektorienterad analys och design. Syftet med detta är att vi kan knyta samman allt som vi har täckt i den här serien och introduktionsserien. 

För det andra är syftet med att göra detta i sin egen handledning så att vi kan spendera resten av denna tid på att gå igenom vår klass, se hur varje del passar ihop, implementera den i plugin och sedan se hur man tillämpar objektorienterad programmering och principen om enansvar kan leda till en mer fokuserad och hållbar lösning.

Innan vi börjar

Vid denna tid antar jag att du har följt med denna serie. Om inte, var god och kolla del 1 och del två. Den här antar att du har följt så länge.

Om du är nybörjare rekommenderar jag att du läser den ursprungliga serien i sin helhet också. När du är upptagen bör du vara i en bra position att avsluta serien när vi sluter med resten av källkoden som omfattas av denna handledning.

Vad vi har gjort så långt

För att ge en snabb sammanfattning och för att se till att vi är alla på samma sida, har vi täckt följande ämnen i den här serien:

  • granskade definitionen av ett klassgränssnitt
  • sett hur en klass implementerar ett gränssnitt
  • granskade principen om ensam ansvar
  • analyserade vår befintliga autoloader
  • skapade en färdplan för vår objektorienterade version av autoloader
  • och utformade en grundläggande implementering för en objektorienterad version av autoloadern

Vid denna tidpunkt är vi redo att byta ut vår befintliga autoloader med den objektorienterade baserade koden. Observera dock att detta inte kommer att vara en enkel fråga om att byta ut filer. 

Vad vi behöver göra

Istället måste vi skapa filerna, se till att de följer WordPress-kodningsstandarderna, implementera dem, testa implementeringen för att se till att pluginet fortfarande fungerar och ta bort den befintliga autoloadern.

Det låter som mycket arbete, men om vår analys och design från tidigare handledning gjordes korrekt och visar sig vara korrekt, borde vi ha lite problem med att göra allt som listas ovan.

Din utvecklingsmiljö

Innan vi hoppar in i genomförandet vill jag ge en snabb översikt över den utvecklingsmiljö du borde ha på ditt system. Tekniskt sett är det här som du borde ha kört enligt instruktioner i tidigare handledning, men jag vill vara så komplett som möjligt.

  • en lokal utvecklingsmiljö som är lämplig för ditt operativsystem
  • en katalog där WordPress 4.6.1 är värd
  • en textredigerare eller IDE
  • kunskap om WordPress Plugin API

Med det sagt, låt oss börja.

Objektorienterad implementering

I det här avsnittet kommer vi att se över hela koden som vi granskade i föregående handledning. Vi kommer dock att titta på varje enskild fil tillsammans med fullständig dokumentation.

Dessutom kommer vi att inkludera det i vårt projekt så att vi i slutet av handledningen kan använda den här koden i stället för den enkla procedurbaserade koden vi använde tidigare.

Observera att var och en av följande filer ska namnges som listade och ska ingå i inc katalogen. Dessutom är allt detta tillgängligt för nedladdning genom att använda den blå knappen i sidofältet i det här inlägget.

klass-autoloader.php

namespace_validator = nytt NamespaceValidator (); $ this-> file_registry = nya FileRegistry ();  / ** * Försök att ladda det angivna filnamnet. * * @paramsträng $ filnamn Banan till filen som vi försöker ladda. * / public function load ($ filnamn) if ($ this-> namespace_validator-> is_valid ($ filnamn)) $ this-> file_registry-> ladda ($ filnamn);  

klass-namespace-validator.php

class-file-investigator.php

get_file_name ($ file_parts, $ current, $ i); om (räkna ($ file_parts) - 1! == $ i) $ filepath = trailingslashit ($ filepath);  returnera $ filepath;  / ** * Hämtar platsen för en del av filnamnet på disken baserat på det aktuella indexet för * -serien som granskas. * * @access privat * @param array $ file_parts Arrayen av alla delar av filnamnet. * @paramsträng $ current Den aktuella delen av filen som ska undersökas. * @param int $ i Det aktuella indexet för arrayen av $ file_parts att granska. * @return sträng Namnet på filen på disken. * / privat funktion get_file_name ($ file_parts, $ current, $ i) $ filnamn = "; om (räkna ($ file_parts) - 1 === $ i) if ($ this-> is_interface ($ file_parts))  $ filename = $ this-> get_interface_name ($ file_parts); annat $ filnamn = $ this-> get_class_name ($ current); annat $ filnamn = $ this-> get_namespace_name ($ current); returnera $ filnamn ; / ** * Bestämmer om den angivna filen som granskas är ett gränssnitt. * * @Access privat * @param array $ file_parts Delarna av filepathen för att undersöka. * @Return bool True om gränssnittet finns i filnamnet, annars , false. * / privat funktion is_interface ($ file_parts) return strpos (strtolower ($ file_parts [count ($ file_parts) - 1]), gränssnitt); / ** * Hämtar gränssnittets filnamn baserat på specificerade delar av filen skickas * till autoloader. * * @access privat * @param array $ file_parts Arrayen av delar av filen som ska undersökas. * @returnsträng Filnamnet på gränssnittet. * / private fu nction get_interface_name ($ file_parts) $ interface_name = explodera ('_', $ file_parts [count ($ file_parts) - 1]); $ interface_name = $ interface_name [0]; returnera "gränssnitt- $ interface_name.php";  / ** * Genererar namnet på klassfilnamnet på disken. * * @access privat * @paramsträng $ current Den aktuella delen av filnamnet för att undersöka. * @returnsträng Klassens filnamn på disken. * / privat funktion get_class_name ($ current) return "class- $ current.php";  / ** * Skapar en kartläggning av namespace i katalogstrukturen. * * @access privat * @paramsträng $ current Den aktuella delen av filen som ska undersökas. * @return-strängen Namnrymdets sökväg mappar till katalogstrukturen. * / privat funktion get_namespace_name ($ current) return '/'. $ Ström;  

class-file-registry.php

utredare = ny FileInvestigator ();  / ** * Använder filutredaren för att hämta platsen för filen på disken. Om det hittas, kommer * det att inkludera det i projektet; annars kommer det att kasta ett WordPress felmeddelande. * * @param sträng $ filepath Stigen till filen på disken för att inkludera i plugin. * / public function load ($ filepath) $ filepath = $ this-> investigator-> get_filetype ($ filepath); $ filepath = rtrim (plugin_dir_path (dirname (__FILE__)), '/'). $ Filepath; om (file_exists ($ filepath)) include_once ($ filepath);  else wp_die (esc_html ('Den angivna filen existerar inte.'));  

Inkluderar filerna, startar autoloader

Nu när vi har skapat våra filer måste vi göra två mindre ändringar:

  1. Vi måste inkludera alla klasser i inc katalog.
  2. Vi måste bli av med den gamla autoloaderkoden.
  3. Och vi måste använda vår nya autoloader med spl_autoload_register fungera.

I slutändan ska den slutgiltiga versionen av autoload.php se ut så här:

Och det kommer att utföra exakt vad vi har skisserat ovan.

Men vänta, jag får ett fel!

Nu har du gjort mycket arbete. Du har refactored hela din autoloader för att använda objektorienterad programmering. Du har dokumenterat dina klasser och funktioner. Du har skapat nya filer, tagit bort koden från gamla filer och du är redo att se till att allt fungerar som förväntat.

Så, som en utvecklare skulle göra, startar du webbläsarfönstret för att uppdatera sidan, bara för att visas ett felmeddelande:

Lyckligtvis är det här en enkel lösning. Problemet är att vi försöker lägga till vår meta-box för tidigt. För att åtgärda detta uppdaterar vi i det metod i vårt Meta_Box klass för att inkludera detta:

Och då introducerar vi en funktion som kommer att vara kopplad till det arbete vi just gjorde:

visa, "render"), "post", "sida", "hög"); 

Vid denna tidpunkt bör du kunna exekvera den nya koden utan problem, inga varningar, inga meddelanden och inga fel.

Slutsats

Arbeta genom allt detta kan ha verkade som mycket - och det var! Men det fina är att det täckte mycket av marken i tre handledningar, och det byggdes på arbetet i en tidigare serie. I det avseendet täcktes många nya ämnen och nya tekniker lärdes.

Observera att jag skriver regelbundet för Envato Tuts +, och du kan hitta alla mina tidigare handledning på min profilsida. Dessutom diskuterar jag ofta mjukvaruutveckling i WordPresss sammanhang på min blogg och på Twitter, så gärna följa med mig på endera platsen.

Med det sagt, studera koden som vi har täckt genom hela denna serie (och kanske den som var före den) och se om du inte kan använda några av dessa tekniker i ditt nuvarande eller framtida arbete.

Medel

  • Använda namnområden och autoloading i WordPress-plugin
  • Objektorienterad autoladdning i WordPress, del 1
  • Objektorienterad autoladdning i WordPress, del 2
  • namnrymder
  • självladdande
  • gränssnitt
  • WordPress Plugin API
  • Principen om ensam ansvar