Utilizarea spațiilor de nume și a autoloading în pluginurile WordPress, Partea 4

Dacă acesta este primul tutorial pe care-l citești în această serie, atunci îmi recomand să-l atingi cu ceea ce am acoperit până acum.

În esență, intri la sfârșitul spectacolului. În acest moment, am pus bazele plugin-ului nostru, am scris plugin-ul și am definit și am explorat spațiile de nume și autoloadere. Tot ce a mai rămas este să aplicăm ceea ce am învățat.

Deci, în acest tutorial, vom pune toate piesele împreună. Mai precis, vom revedea codul sursă al plugin-ului nostru, spațiul de nume al tuturor claselor relevante și vom scrie un autoloader pentru a putea elimina toate declarațiile noastre includ.

Voi discuta totul în detaliu când lucrăm prin cod. Din nou, dacă acesta este primul tutorial pe care îl citiți în această serie, prindeți-vă ceea ce am acoperit până acum și apoi reveniți la acest tutorial.

Înainte de a scrie orice cod

În acest sens, trebuie să fiți familiarizați cu modul în care am creat mediul de dezvoltare. Ca o reîmprospătare, iată o scurtă analiză a software-ului pe care îl folosim:

  • cel puțin PHP 5.6.20
  • serverul web Apache
  • un server de baze de date MySQL
  • WordPress 4.6.1
  • o cunoastere practica a API-ului WordPress Plugin

De asemenea, veți avea nevoie de o copie a codului sursă al pluginului cu care lucrăm. Poți să-ți iei o copie aici. Presupunând că este instalat, activat și că aveți IDE rulat, să începem.

Numeste codul

Amintiți-vă din tutorialul anterior, sunt un fan al asigurării că spațiile noastre de nume urmează organizarea fișierelor pe disc. Dacă vă uitați la structura de directoare a pluginului nostru sau dacă ați urmat împreună cu seria până acum, ar trebui să vedeți ceva de genul:

Rețineți că, dacă ați configurat pluginul în mod diferit, este bine. Spațiul dvs. de nume va fi probabil diferit, dar acest lucru nu ar trebui să afecteze nimic care este acoperit în această serie.

Folosind structura directorului ca îndrumare, hai să trecem prin toate fișierele PHP care alcătuiesc plugin-ul nostru și să definim spațiile lor de nume. Făcând acest lucru este ușor: este pur și simplu chestiunea folosirii cuvântului cheie cu numele de domeniu și plasarea unui nume calificat în partea de sus a fiecărui fișier.

Voi lista fiecare de mai jos.

tutsplus-namespace-demo.php

clasa-meta-box.php

clasa-meta-box-display.php

interfață-assets.php

clasa-css-loader.php

clasa-intrebare-reader.php

Există câteva lucruri de observat despre convențiile pe care le-am folosit mai sus:

  • Spațiul de nume rădăcină este Tutsplus_Namespace_Demo, care corespunde cu numele directorului pluginului.
  • Restul spațiilor de nume, cum ar fi Tutsplus_Namespace_Demo \ Admin și Tutsplus_Namespace_Demo \ Admin \ util corespund, de asemenea, directoarelor lor respective; totuși, numele de directoare sunt împachetate (versus mici).

În cele din urmă, dacă ați încercat să actualizați pagina sau ați încercat să navigați în jurul WordPress de la introducerea declarațiilor din spațiul de nume, probabil că veți vedea o eroare în consola dvs. care arată astfel:

Și include următorul mesaj:

Avertisment PHP: call_user_func_array () se așteaptă ca parametrul 1 să fie un callback valid, funcția "tutsplus_namespace_demo" nu a fost găsită sau nume de funcție nevalidă în /Users/tommcfarlin/Dropbox/Projects/tutsplus/wp-includes/plugin.php pe linia 524

Sau poate arata:

PHP Eroare fatală: Clasa "Meta_Box" nu a fost găsită în /Users/tommcfarlin/Dropbox/Projects/tutsplus/wp-content/plugins/tutsplus-namespace-demo/tutsplus-namespace-demo.php pe linia 48

Sau puteți vedea orice număr de mesaje de eroare similare. Este în regulă. Este normal.

Dar ridică întrebarea: Ce face pluginul nostru? Din fericire, nimic. Acest comportament este așteptat.

Primul mesaj pe care îl vedeți Mai fi rezultatul unui alt plugin pe care l-ați instalat. Nu am reușit să o reproduc pe cont propriu; totuși, când dezactivez câteva din celelalte pluginuri pe care le-am rulat, plugin-ul a generat al doilea mesaj (mesajul pe care doream să-l demonstrez).

Când codul namespace, PHP se așteaptă să localizeze o clasă într-un spațiu de nume dat. Conceptual, vă puteți gândi la clasele dvs. care aparțin acum propriului pachet (sau subpachetului) sau oricum îl definiți. Și pentru ca o funcție să acceseze o clasă dintr-un pachet, trebuie să fie conștienți de pachetele care există.

Aici se află în joc funcționalitatea spațiului de nume suplimentar și autoloading. Așa că, înainte de a încerca să ne accesăm codul prin spațiile lor de nume, să lucrăm la un autoloader.

Totul despre Autoloading

Scrierea unui autoloader va necesita următoarele:

  1. înțelegerea unei funcții PHP numită spl_autoload_register
  2. scriind o funcție care va încărca automat fișierele cu numere de imagine
  3. inclusiv funcția noastră autoloading personalizată

Nu lăsa numele spl_autoload_register te intimida. Pur și simplu înseamnă că aceasta este o funcție care face parte din "Biblioteca standard de PHP" și este modul în care "înregistrăm" o funcție "autoload". Este o gură de spus și o mulțime de caractere pentru a scrie, dar este doar o funcție pe care o vom folosi pentru a spune PHP cum să analizăm spațiile de nume și numele claselor și unde se pot găsi fișierele noastre.

Această funcție este ceea ce ne permite să scriem propriul cod personalizat pentru fișierele autoloading și apoi să conectăm această funcție la PHP. Asta este, vom spune PHP unde să găsească fișierele noastre și cum să analizeze spațiile de nume, numele de fișiere și așa mai departe, astfel încât să includă fișierele.

Cu toate acestea, suntem gata să scriem un autoloader.

Scriind un autoloader

Când scrieți un autoloader, lucrurile pe care trebuie să le țineți cont sunt modul în care sunt organizate fișierele noastre. Adică, vrem să știm cum să-și mapăm spațiile de nume la directoarele noastre. 

În exemplul pe care îl folosim, este simplu: Spațiile de nume sunt versiuni cusate ale structurii de directoare. Acest lucru nu este întotdeauna adevărat pentru alte proiecte; cu toate acestea, este încă un motiv pentru care îmi place să-mi organizez logic fișierele în funcție de locația lor fizică.

Când PHP încearcă să încarce o clasă, autoloaderul nostru va trebui să facă următoarele:

  1. Împărțiți spațiul de nume în funcție de tăieturi.
  2. Împărțiți pachetul și subpachetele pe baza sublinierilor și înlocuiți-le cu cratime (dacă este necesar).
  3. Aflați cum puteți să clasificați numele de clasă, interfețele și așa mai departe pe numele fișierelor.
  4. Creați o reprezentare de șir a numelui de fișier pe baza informațiilor de mai sus.
  5. Includeți fișierul.

Cu toate aceste aspecte făcute, ne-am desființat munca pentru noi. În directorul plugin, creați un subdirector numit inc, și în inc directorul crea un fișier numit autoload.php.

În fișierul respectiv, să mergem mai departe și să eliminăm funcția pe care o vom folosi pentru a ne autolozi fișierele. Ar trebui să arate ceva de genul:

Evident, acest lucru nu face nimic încă.

Notă laterală despre scrierea unui autoloader

Rețineți că voi scrie codul și comentariile de cod pentru a explica bine ceea ce facem. Dacă vă aventurați în acest lucru pe cont propriu pentru prima dată, scrierea unui autoloader împreună cu utilizarea spațiilor de nume și lucrul cu fișiere ar putea fi un pic frustrant. Acesta este locul unde un program de depanare și utilizarea fișierelor jurnal pot veni la îndemână. 

Acest lucru este în afara scopului acestui tutorial, dar știți că scrierea unui autoloader nu este ceva pe care îl puteți obține prima oară când o faceți.

Finalizarea Autoloaderului

Să începem să adăugăm o anumită funcționalitate având în vedere pașii listați la începutul acestei secțiuni.

În primul rând, trebuie să setăm o buclă care va itera înapoi prin părțile din numele fișierului care sunt transmise în funcția de autoreglare. Facem acest lucru deoarece face mai ușor să construim o cale către fișierul autoload.

 0; $ i--) // Mai mult să vină ... 

După aceasta, trebuie să ne uităm la $ file_parts și să înlocuiască toate aparițiile sublinierii cu o cratimă, deoarece toate numele de clasă și interfața folosesc subliniază, în timp ce numele de fișiere folosesc cratime.

Următoarele două linii sunt primele două linii din interiorul bucla pe care am stubat mai sus:

Apoi, vom avea nevoie de o condiție care face câteva lucruri.

  1. Trebuie să verificați pentru a vedea care intrare a căii de fișier pe care o citim.
  2. Dacă suntem la prima intrare, atunci suntem la numele fișierului; în caz contrar, suntem în spațiul său de nume.
  3. În continuare, dacă citim prima intrare, trebuie să determinăm dacă încercăm să autoloidăm o interfață sau dacă încărcăm o clasă.
  4. Dacă este primul, atunci trebuie să ajustăm numele interfeței astfel încât să o încărcăm corect pe baza numelui său de fișier; în caz contrar, vom încărca clasa pe baza valorii în $ curent variabil.

Citește mult, dar nu ar trebui să fie complicat să citești. Vedeți codul comentat mai jos:

Odată cu aceasta, este timpul să construim o cale complet calificată pentru fișier. Din fericire, acest lucru este puțin mai mult decât concatenarea șirului de bază:

În cele din urmă, trebuie să ne asigurăm că fișierul există. Dacă nu, vom afișa un mesaj de eroare standard WordPress:

Și în acest moment, avem un autoloader complet (care poate fi preluat prin descărcarea fișierelor de pe link-ul din bara laterală a acestui post deoarece codul sursă ar fi un pic lung pentru a posta aici în tutorial).

În cele din urmă, este important să rețineți că această funcție particulară ar putea (sau ar trebui) să fie rescrisă ca o clasă. Mai mult, clasa ar trebui să fie alcătuită din mai multe funcții mai mici, care să poată fi testabile, să aibă o singură responsabilitate și să citească mai clar decât cele de mai sus. Poate într-un tutorial bonus, voi trece prin procesul de cum ar arăta.

Dar încă includem fișiere

Dacă vă uitați în partea de sus a fișierului plugin principal (sau fișierul bootstrap pe care l-am denumit adesea), veți observa mai multe include afirmații care arată astfel:

Având în vedere lucrul pe care l-am făcut până acum, putem în final să eliminăm aceste afirmații și să le înlocuim cu una singură:

Pentru a fi clar, o înlocuim cu autoloaderul nostru. În acest moment, ar trebui să terminăm cu pluginul nostru.

Punându-le pe toți împreună

Acum, când am introdus codul nostru pentru a oferi o organizare logică a claselor conexe și a scris un autoloader pentru a include în mod automat fișiere bazate pe spațiul de nume și fișierul fiecărei clase, ar trebui să putem începe pluginul și să îl executăm exact așa cum a făcut în timpul primei iterații reușite.

Ultimul lucru pe care trebuie să-l facem este să ne asigurăm că actualizăm fișierul bootstrap astfel încât să instruim PHP să folosească spațiile de nume pentru Meta_Box, Meta_Box_Display, Question_Reader, si CSS_Loader.

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

Observați în codul de mai sus că folosim PHP-urile utilizare și ne prefixăm numele claselor cu subpachetele lor imediate. Puteți citi mai multe despre utilizarea în manual, dar o scurtă parte a acestuia este:

 utilizare cuvântul cheie trebuie declarat în sfera de aplicare a unui fișier (domeniul global) sau în interiorul declarațiilor din spațiul de nume. Acest lucru se datorează faptului că importul se face la timpul de compilare și nu la timpul de execuție, deci nu poate fi blocat. 

Cu asta a spus și presupunând că toate funcționează corect, ar trebui să puteți naviga la Adăugați postare nouă pagina (sau Editează postarea), vizualizați caseta de meta și vedeți o solicitare de întrebări în partea de sus a barei laterale:

Dacă da, atunci felicitări. Ați configurat pluginul în spațiul de nume și în autoloading. Dacă nu, verificați din nou codul în funcție de ceea ce am împărtășit aici, examinați jurnalele de eroare și asigurați-vă că nimic nu se afișează neobișnuit în ecranul de administrare WordPress.

daca tu do vezi ceva, șansele sunt legate de ceva minor. Examinați codul pe care l-am acoperit, comparați-l cu ceea ce este atașat aici la această postare (în bara laterală împreună cu butonul albastru mare) și vedeți dacă puteți restrânge problema.

Concluzie

În acest moment, am ajuns la sfârșitul seriilor noastre. De-a lungul ultimelor patru tutoriale, am acoperit o mulțime de teren:

  • Am construit un plugin care îi solicită utilizatorilor întrebări pentru a ajuta la lansarea blogurilor lor.
  • Am folosit funcții PHP pentru citirea fișierelor din sistemul de fișiere și redarea acestora pe ecran.
  • Am definit spații de nume și autoloading și am analizat modul în care pot fi aplicate.
  • Ne-am organizat codul și l-am scris pe autoloader, făcând codul mai ușor de citit, mai organizat și mai puțin aglomerat.

În cele din urmă, o mulțime de materiale acoperite în cadrul acestei serii pot fi utilizate în proiecte existente și viitoare pe care ați putea lucra. 

Amintiți-vă că puteți găsi și alte produse legate de WordPress pe piața noastră. Și dacă doriți să aflați mai multe despre dezvoltarea de soluții pentru WordPress, puteți găsi toate tutorialele și serialele mele pe pagina mea de profil. Nu ezitați să mă urmați pe blogul meu sau pe Twitter, deoarece discut aproape în fiecare zi despre dezvoltarea de software în contextul WordPress.

Și rețineți, legătura este pentru descărcarea ultimului cod sursă este în bara laterală sub un buton intitulat Descărcați atașamentul. Desigur, nu ezitați să adresați întrebări în comentariile dvs.!

Resurse

  • spl_autoload_register
  • utilizare
Cod