Object-Oriented Autoloading în WordPress, Partea 3

În ultimul tutorial, am revizuit starea inițială a autoloaderului nostru și apoi am trecut printr-un proces de analiză și proiectare orientată pe obiecte. Scopul acestui lucru este să putem lega împreună tot ce am acoperit în această serie și seria introductivă. 

În al doilea rând, scopul de a face acest lucru în propriul său tutorial este ca noi să putem petrece restul acestui timp de mers pe jos prin clasa noastră, văzând modul în care fiecare parte se potrivește împreună, punerea în aplicare în pluginul nostru, și apoi vedea modul în care aplicarea de programare orientată-obiect și principiul responsabilității unice poate conduce la o soluție mai concentrată și mai durabilă.

Înainte de a începe

În acest moment, presupun că ați urmat împreună cu această serie. Dacă nu, atunci vă rugăm să consultați partea întâi și partea a doua. Aceasta presupune că ați urmat până acum.

Dacă sunteți începător, vă recomand să citiți și seria inițială în întregime. Odată ce ați fost prinși, ar trebui să vă aflați într-o poziție bună pentru a finaliza seria pe măsură ce încheiem cu restul codului sursă acoperit în acest tutorial.

Ce am făcut atât de departe

Pentru a oferi un rezumat rapid și pentru a ne asigura că suntem pe aceeași pagină, am abordat următoarele subiecte din această serie:

  • a revizuit definiția unei interfețe de clasă
  • a văzut cum o clasă implementează o interfață
  • a revizuit principiul responsabilității unice
  • a analizat autologul nostru existent
  • a creat o foaie de parcurs pentru versiunea noastră orientată pe obiect a autoloaderului
  • și a proiectat o implementare de bază pentru o versiune orientată pe obiecte a autoloaderului

În acest moment, suntem gata să schimbăm autoloaderul existent cu codul bazat pe obiect. Rețineți însă că nu va fi o simplă chestiune de schimbare a fișierelor. 

Ce trebuie să facem

În schimb, va trebui să creați fișierele, să vă asigurați că respectă standardele de codare WordPress, să le implementeze, să testeze implementarea lor pentru a vă asigura că pluginul funcționează și apoi să eliminați autoloaderul existent.

Suna ca o mulțime de muncă, dar dacă analiza și designul nostru de la tutorialul anterior a fost făcut corect și se dovedește a fi exacte, atunci ar trebui să avem puțină problemă făcând tot ce este menționat mai sus.

Mediul de dezvoltare

Înainte de a intra în implementare, vreau să vă dau o scurtă descriere a mediului de dezvoltare pe care ar trebui să-l aveți în sistemul dvs. Din punct de vedere tehnic, acesta este un lucru pe care ar trebui să-l executați deja pe direcțiile din tutoriile anterioare, dar vreau să fiu cât mai complet posibil.

  • un mediu de dezvoltare local adaptat sistemului dvs. de operare
  • un director din care WordPress 4.6.1 este găzduit
  • un editor de text sau IDE
  • cunoașterea API-ului WordPress Plugin

Cu asta a spus, să începem.

Object-Oriented Implementation

În această secțiune, vom revedea tot codul pe care l-am revizuit în tutorialul anterior; cu toate acestea, vom analiza fiecare fișier individual împreună cu documentația completă.

În plus, o vom include în proiectul nostru, astfel încât până la sfârșitul tutorialului vom putea folosi acest cod în locul codului unic, bazat pe proceduri, pe care l-am folosit mai devreme.

Rețineți că fiecare dintre următoarele fișiere ar trebui să fie denumit ca enumerate și ar trebui să fie incluse în inc director. În plus, toate acestea sunt disponibile pentru descărcare utilizând butonul albastru din bara laterală a acestui post.

clasa-autoloader.php

namespace_validator = nou NamespaceValidator (); $ this-> file_registry = noul FileRegistry ();  / ** * Încercă să se încarce numele de fișier specificat. * * @ param string $ filename Calea către fișierul pe care încercăm să o încărcăm. * / sarcina funcției publice (numele fișierului $) if ($ this-> namespace_validator-> is_valid ($ nume fișier)) $ this-> file_registry-> load (nume fișier $);  

clasa-namespace-validator.php

clasa-file-investigator.php

get_file_name ($ file_parts, $ curent, $ i); dacă (numără ($ file_parts) - 1! == $ i) $ filepath = trailingslashit ($ filepath);  retur $ filepath;  / ** * Returnează locația unei părți a numelui de fișier pe disc pe baza indexului curent al * matricei examinate. * * @access private * @param array $ file_parts Matricea tuturor părților din numele fișierului. * @ string string $ curent Partea actuală a fișierului pentru a examina. * @param int $ i Indicele curent al matricei de $ file_parts pentru a examina. * @ string retur Numele fișierului pe disc. * / funcția privată get_file_name ($ file_parts, $ current, $ i) $ filename = "; if (count ($ file_parts) - 1 === $ i) if ($ this-> is_interface ($ file_parts) $ filename = $ this-> get_interface_name ($ file_parts); altul $ filename = $ this-> get_class_name ($ curent); altceva $ filename = $ this-> get_namespace_name ($ current); ; / ** * Determină dacă fișierul specificat care este examinat este o interfață. * * @Access private * @param array $ file_parts Părțile filepath pentru a examina. * @Return bool Adevărat dacă interfața este conținută în numele fișierului; , false * * / funcția privată is_interface ($ file_parts) returnează strpos (strtolower ($ file_parts [count ($ file_parts) - 1]), 'interfață'); anumite părți ale fișierului trecute * în autoloader * * @access privat * @param array $ file_parts Matricea de părți ale fișierului de examinat. * @return string Numele fișierului interfeței. * / private fu nction get_interface_name ($ fișier_parts) $ interface_name = explode ('_', $ file_parts [count ($ file_parts) - 1]); $ interface_name = $ numele interfeței [0]; return "interfață- $ interface_name.php";  / ** * generează numele fișierului de clasă pe disc. * * @acces privat * @param string $ current piesa curentă a numelui de fișier pentru a examina. * @ string retur Numele fisierului de clasa pe disc. * / funcția privată get_class_name ($ curent) returnează "class- $ current.php";  / ** * Creează o mapare a spațiului de nume în structura directorului. * * @acces privat * @param string $ actual Partea curentă a dosarului de examinat. * @ string retur Calea mapării spațiului de nume la structura directorului. * / funcția privată get_namespace_name ($ curent) return '/'. $ Curent;  

clasa-file-registry.php

investigator = noul FileInvestigator ();  / ** * Utilizează investigatorul de fișiere pentru a prelua locația fișierului pe disc. Dacă se găsește, atunci * o va include în proiect; în caz contrar, va arunca un mesaj de eroare WordPress. * * @param string $ filepath Calea către fișierul de pe disc pentru a include în plugin. * / încărcarea funcției publice ($ filepath) $ filepath = $ this-> investigator-> get_filetype ($ filepath); $ filepath = rtrim (plugin_dir_path (dirname (__FILE__)), '/'). $ Filepath; dacă (file_exists ($ filepath)) include_once ($ filepath);  altceva wp_die (esc_html ('Fișierul specificat nu există.'));  

Includerea fișierelor, Pornirea aplicației Autoloader

Acum, când am creat fișierele noastre, trebuie să facem două modificări mici:

  1. Trebuie să includem toate clasele în directorul inc.
  2. Trebuie să scăpăm de vechiul cod de autoloader.
  3. Și trebuie să folosim noul nostru autoloader cu spl_autoload_register funcţie.

În cele din urmă, versiunea finală a autoload.php ar trebui să arate astfel:

Și va realiza exact ceea ce am subliniat mai sus.

Dar așteptați, am primit o eroare!

În acest moment ați făcut multe lucruri. Ați refactat întreaga autoloader pentru a utiliza programarea orientată pe obiecte. Dvs. ați documentat clasele și funcțiile. Ați creat fișiere noi, ați eliminat codul din fișiere vechi și sunteți gata să vă asigurați că totul funcționează conform așteptărilor.

Deci, așa cum ar face orice dezvoltator, lansați fereastra browserului pentru a reîmprospăta pagina, doar pentru a fi afișat un mesaj de eroare:

Din fericire, acesta este un remediu ușor. Problema este că încercăm să adăugăm meta-caseta prea devreme. Pentru a rezolva acest lucru, vom actualiza init în metoda noastră Meta_Box clasa pentru a include aceasta:

Și apoi vom introduce o funcție care va fi cuprinsă de lucrarea pe care tocmai am făcut-o:

afișare, "render"), "post", "partea", "mare"); 

În acest moment, ar trebui să puteți executa noul cod fără probleme, fără avertismente, fără notificări și fără erori.

Concluzie

Muncind prin toate astea ar fi putut părea mult - și a fost! Dar chestia frumoasă este că a acoperit o mulțime de teren în trei tutoriale, și acesta a fost construit pe baza unei serii anterioare. În această privință, au fost abordate multe subiecte noi și au fost învățate noi tehnici.

Rețineți că scriu în mod regulat pentru Envato Tuts + și puteți găsi toate tutorialele mele anterioare pe pagina mea de profil. În plus, discut adesea despre dezvoltarea de software în contextul WordPress pe blogul meu și pe Twitter, deci nu ezitați să mă urmați pe nici un loc.

Cu acest lucru, studiați codul pe care l-am acoperit în această serie (și probabil cel precedent) și vedeți dacă nu puteți utiliza unele dintre aceste tehnici în activitatea dvs. existentă sau viitoare.

Resurse

  • Utilizarea spațiilor de nume și Autoloading în pluginurile WordPress
  • Obiect-Oriented Autoloading în WordPress, Partea 1
  • Object-Oriented Autoloading în WordPress, Partea 2
  • Spații de nume
  • Autoîncărcarea
  • interfeţe
  • API-ul Plugin-ului WordPress
  • Principiul unic de responsabilitate
Cod