Această parte a două serii privesc două stiluri de programare diferite (uneori numite paradigme de programare) pe care le puteți utiliza atunci când scrieți pluginuri WordPress. În prima parte, Tom McFarlin acoperea programarea orientată pe obiecte. În această parte vom analiza programarea funcțională.
Deoarece nivelul de experiență al cititorilor variază, vom vorbi despre programarea la nivel înalt, deci dacă sunteți începător, atunci nu ar trebui să aveți nicio problemă în urma. Dacă totuși sunteți un dezvoltator mai experimentat, puteți găsi mai multe informații mai utile mai târziu în articol.
Funcționarea programării este, probabil, stilul cu care sunteți cel mai familiar - și aproape universal - este stilul folosit în diversele site-uri WordPress de fragmente de cod care plutesc în jurul internetului. Din acest motiv, uneori, poate fi privit ca programare la nivel de intrare: stilul folosit de începători până când au învățat să stăpânească programarea orientată pe obiecte. Acest lucru este incredibil de înșelător, deoarece în timp ce programarea funcțională este mult mai simplă, ea nu este în sine inferioară.
Programarea funcțională pune accentul pe evaluarea funcțiilor și evită noțiunea de state sau obiecte, spre deosebire de programarea orientată obiect, care încurajează gândirea codului ca acționând asupra obiectelor, folosind metode de a schimba aceste obiecte sau de a interacționa cu ele. Să ne uităm la un exemplu foarte simplu comparând cele două stiluri:
Funcția funcțională funcțională add_two ($ n) return $ n +2; $ a = 2; $ b = add_two ($ a); // $ b = 4; // Clasă de metodă orientată pe obiecte Număr var $ value = 0; funcția __construct ($ a) $ this-> value = $ a; funcția add_two () $ this-> value = $ this-> value +2; $ a = număr nou (2); echo $ a-> valoare; // Imprimă 2 $ a-> add_two (); echo $ a-> valoare; // Prints 4
Acest exemplu foarte simplu ilustrează diferența fundamentală în stilul celor două paradigme: programarea funcțională se concentrează pe trecerea argumentelor către și primirea valorilor din funcții. Nu există "obiecte" la care să se acționeze, doar parametrii și valorile returnate. În schimb, abordarea orientată pe obiecte atribuie unui obiect diferite proprietăți (în cazul nostru o "valoare"), iar metodele acționează asupra acelor proprietăți.
Definirea funcțiilor este foarte simplă:
adăugați funcția (numărul $, $ number2 = 1) // Efectuați codul care acționează asupra variabilelor trecute $ sum = $ number + $ number2; // Opțional, dacă este necesar, puteți returna suma sumă returnată $;
Odată ce funcția este declarată, aceasta poate fi utilizată oriunde în plug-in - cu alte cuvinte, are o arie globală.
$ a = 4; $ b = 7; adăugați echo ($ a, $ b); // Prints 11Funcțiile trebuie să aibă nume unice. Redenumirea unei funcții va arunca o eroare. Deoarece codul dvs. va fi difuzat alături de alte plug-in-uri, teme și WordPress în sine, nu trebuie să utilizați niciodată nume generice. În schimb, trebuie să vă prefixați numele funcțiilor cu ceva unic (cum ar fi numele plug-in-ului).
S-ar putea să fi observat că în definiția lui adăuga
, al doilea argument este egal cu 1
. Aceasta stabilește o valoare implicită pentru $ număr_2
(în acest caz, 1), făcând astfel argumentul opțional. Dacă argumentul nu este furnizat, valoarea este considerată a fi valoarea implicită:
adăugați echo (4); // Imprimă 5 ecouri (4, 1); // Prints 5
Pe de altă parte, nu este prevăzută nicio valoare implicită pentru prima valoare, astfel încât omiterea acestui argument va arunca o eroare
echo add (); // Aruncă o eroare deoarece numărul de $ nu este definit
De asemenea, puteți avea un număr variabil de argumente. În interiorul funcției pe care o putem folosi func_num_args ()
pentru a obține numărul de argumente primite, în timp ce func_get_arg ()
vă permite să accesați o anumită variabilă depășită, indexată de la 0.
sumă funcțională () // obține numărul de argumente date sum () $ number_args = func_num_args (); $ sum = 0; dacă (! $ number_args) returnează suma $; pentru ($ i = 0; $ i < $number_args; $i++ ) $sum += func_get_arg( $i ); return $sum; echo sum( 1, 2, 3, 4 ); //Prints 10 echo sum( 1, 2 ); //Prints 3 echo sum(); //Prints 0
Cele de mai sus pot fi folosite și în metodele obiect. În final, declarând o variabilă ca fiind "globală", puteți accesa variabila din interiorul unei funcții.
$ a = 'Bună ziua'; $ b = 'Lumea'; funcția hello_world () // Aceasta este necesară pentru a accesa $ a și $ b // declarate în afara scopului funcției. globale $ a, $ b; $ b = $ a. ". $ b; hello_world (); echo $ b; // Imprimă" Hello World "Folosirea globalelor este în general descurajată. În mod special, deoarece două pluginuri care utilizează același nume pentru o variabilă globală pot provoca întreruperea fie a unul sau a ambelor plug-in-uri. Dacă trebuie să utilizați o variabilă globală, asigurați-vă din nou că este unică prin prefixarea cu numele plug-in-ului.
Deciderea stilului de programare pe care îl folosiți ajunge la judecată - și da - la preferințele personale. Nu este mai bine sau mai greșit să utilizați funcțional peste programarea orientată pe obiecte, dar mai des nu există un stil care este mai potrivit pentru ceea ce încercați să obțineți.
Uneori, programarea orientată pe obiecte pur și simplu nu este necesară și doar complică lucrurile sau introduce un cod inutil. Un exemplu ar putea fi diferitele funcții "utilitare" pe care WordPress le oferă. Acestea sunt funcții generice care servesc la îndeplinirea unui anumit scop. De exemplu wp_trim_words ($ text, $ num_words)
pur și simplu trims șirul dat la o anumită dimensiune (în cuvinte). Nu ar adăuga nimic pentru a defini wp_trim_words ()
în loc ca o metodă aparținând unui anumit obiect, și ar duce la un cod mai urât. Cu programarea funcțională este nevoie de o linie.
Un avantaj al programării funcționale, în special pentru începători, este simplitatea acesteia. Nu trebuie să vă faceți griji cu privire la funcțiile statice, private sau protejate - toate sunt globale. Nici noțiunea de variabile statice nu există. La nivelul foarte fundamental, funcția dvs. returnează o ieșire derivată din ceea ce i-ați dat. De exemplu, get_the_title (7)
va returna titlul pentru post cu ID 7.
Un alt avantaj al programării funcționale este faptul că funcțiile sunt accesibile la nivel global. Cu programele orientate pe obiect, pentru a acționa pe un anumit obiect, trebuie să treci în jurul acelui obiect. Acest lucru poate fi uneori dificil. Pentru a ilustra acest lucru, să luăm un exemplu din prima parte:
class DemoPlugin funcția publică __construct () add_action ('wp_enqueue_scripts', array ($ this, 'register_plugin_scripts')); funcția publică register_plugin_scripts () // Înregistrează scripturile pluginului $ demo_plugin = new DemoPlugin ();
Atunci când WordPress stochează register_plugin_scripts ()
astfel încât să poată fi apelat atunci când wp_enqueue_scripts
acțiunea este declanșată, aceasta face acest lucru prin referirea nu numai la metodă, ci și la obiect $ demo_plugin
. Acest lucru se datorează faptului că se ia în considerare aceeași metodă pentru diferite instanțe ale unui obiect diferit metode - adică, $ Demo_plugin-> register_plugin_scripts ()
și $ Copy_of_demo_plugin-> register_plugin_scripts ()
nu sunt la fel. Acest lucru poate părea ciudat - dar metodele se pot comporta diferit pentru diferite instanțe din aceeași clasă, deci trebuie să facem referire atât la metodă, cât și la instanță.
Dar de ce are această chestiune? Este foarte dificil pentru un plug-in sau o temă terță parte să descopere această metodă, deoarece pentru a face acest lucru ar trebui să sune:
remove_action ('wp_enqueue_scripts', array ($ demo_plugin, 'register_plugin_scripts'));
Dar, în general, nu vor avea acces la $ demo_plugin
variabil. (Notă: dacă metoda este declarată statică, atunci puteți ajunge în jurul acesteia).
Desigur, programele orientate pe obiect au avantajele lor, după cum sa discutat în prima parte. Așa cum a menționat și Tom, este inevitabil atunci când se utilizează API widget-ul WordPress. Un alt exemplu comun este WP_Query ()
. Aici, o abordare orientată spre obiecte este în mod clar cea mai bună: aveți un obiect (în acest caz o interogare), care are diferite proprietăți (de exemplu criterii de căutare, informații de paginare, rezultate potrivite) și doriți să acționați pe acea interogare și dezinfectarea SQL corespunzătoare și returnarea rezultatelor).
WP_Query ()
demonstrează cât de puternic poate fi programarea orientată spre obiect atunci când este utilizată corect. După inițierea interogării:
$ the_query = noua valoare WP_Query (array (...));
Nu numai că puteți accesa rezultatele, dar și alte informații, precum valorile paginării: câte pagini de rezultate există, ce pagină este vizionată, numărul total de rezultate și tipul de interogare, de ex.. $ The_query-> is_search ()
, $ The_query-> is_single ()
etc Există, de asemenea, întreaga infrastructură "bucla";
dacă ($ the_query-> have_posts ()) echo '
Ceea ce ascunde toată jonglarea internă a rezultatelor și a globalelor în spatele unui API prietenos cu oamenii.
Deci, ce zici get_posts ()
? Acest lucru servește doar ca un înveliș pentru WP_Query ()
, și întoarce pur și simplu o serie de posturi care corespund interogării. Ca atare, nu veți primi "clopotele și fluierele" WP_Query ()
, dar este puțin mai eficientă. Deci, dacă ar trebui să utilizați get_posts ()
sau WP_Query ()
depinde de cazul dvs. de utilizare (de exemplu, dacă aveți nevoie de paginare sau nu), dar este, de asemenea, în funcție de preferințele personale.
$ results = get_posts (array (...)); dacă ($ rezultate) echo '
Sperăm că aceste două articole au ajutat la evidențierea avantajelor și dezavantajelor acestor stiluri de programare. Punctul de plecare este că nu există nici un drept și rău aici, și fiecare programator va avea propria lor preferință personală. Însă unele contexte se oferă mai ușor la un anumit stil de programare - și, ca atare, ar trebui să vă așteptați ca plug-in-ul să conțină un amestec de ambele.