PHP 101

Nu ne negăm că a noastră este o industrie incredibil de dificilă. V-ați gândit vreodată să învățați oa doua limbă? Ei bine, ce zici de cinci? Asta este ceea ce vi se va cere, dacă intenționați să deveniți un dezvoltator web modern. Luând în considerare acest lucru, dacă nu sunteți atent, foarte repede, vă puteți găsi copleșiți, în timp ce vă uitați orbește la nenumărate articole de blog confuză sau cărți tehnice.

Cheia, ca și în orice altceva, este de a face un pas la un moment dat.

Cheia, ca și în orice altceva, este de a face un pas la un moment dat. V-ați greșit pentru că nu ați învățat o limbă vorbită într-o lună? Desigur că nu. Apoi, aplicați același nivel de gândire la călătoria dvs. de programare. Aceste lucruri necesită timp, dar, atâta timp cât veți continua să vă împingeți înainte, veți fi acolo în cel mai scurt timp. Nu te opri!

Pasul unu este HTML. Înțelegeți ce scop a

servește. Aflați cum să structurați conținutul utilizând etichete semantice. Construiți o pagină web de bază, nemodificată.

Pasul doi, după cum probabil ați ghicit, este CSS. Aflați cum să stylizați elemente pe pagină. Apreciați ce se referă la "separarea preocupărilor" și modul în care aceasta se aplică în cazul HTML și CSS. Completați primul site simplu.

Pasul trei este când dezvoltatorii încep să se desprindă în specialitățile lor. În acest moment, vă puteți scufunda în lumea JavaScript, care este în plină expansiune ca niciodată înainte. Sau puteți să vă concentrați eforturile pe backend.

Confuzată de diferența dintre în față și backend? Gândiți-vă la frontend ca vârful aisbergului care a adus Titanicul. Partea din aplicație este vizibilă pentru utilizator și poate fi interacțioasă. Backend-ul, pe de altă parte, se ocupă de tot, de la persistență, la validări, la rutare.

În sensul acestui articol, să presupunem că ați ales ultima opțiune; partea de server, este!

Nu se poate nega faptul că PHP domină web-ul.

Din nefericire, încă o dată, veniți pe o mână de căi de luat. Dacă alegeți cea mai populară opțiune - PHP? Ce e cu Ruby? Copiii răi par să preferă aceste zile. Și din nou, dacă aveți o barbă? Este Python alegerea corectă. Cel mai important, totuși, cum puteți face o selecție, când aveți experiență zero?

În astfel de situații - și în opinia autorului - nu există o alegere greșită. Și, cu siguranță, nu există nimic care să vă interzică să treceți de pe drum. De fapt, toți dezvoltatorii sunt încurajați să învețe mai multe limbi! Pentru moment, totuși, cheia este de a alege doar unul și de a învăța bine.

În timp ce este adevărat că PHP nu este cea mai frumoasă dintre limbi, nu există nici un semn că domină web-ul. De fapt, este cel mai popular limbaj de scripting din lume. Avantajul este că puteți fi siguri că fiecare întrebare PHP a fost deja întrebată, rezolvată și documentată. Există confort în a ști asta. Deși sunteți în cea mai fragilă etapă a învățării, o comunitate masivă și prietenoasă este la ușă, gata să vă ajute. Chiar mai bine, PHP se confruntă cu o renaștere modernă ca niciodată, datorită instrumentelor precum Composer și Laravel.


Ce este PHP?

PHP, un acronim pentru PHP: Hypertext Preprocessor (da, dezvoltatorii iubesc glumele lor recursive), este un limbaj de scripting care a fost construit special pentru web. Șansele sunt mari, totuși, că acest lucru încă nu înseamnă nimic pentru tine. Scripting language? Nu-i asa? Când ați ajunge pentru PHP peste HTML simplu? Ei bine, poate este un exemplu în ordine. Presupunând că ați instalat cu succes PHP, creați un index.php fișier într-un nou folder de pe desktop și adăugați:

 

Da, este omniprezenta "Salut Lume"exemplu că veți deveni destul de familiarizat cu progresul abilităților dvs. Fiecare limbă / cadru / instrument are una!

Pentru a rula acest cod, utilizați serverul PHP construit. Treceți la instrumentul de linie de comandă preferat (Terminal, pentru utilizatorii de Mac), CD în dosarul proiectului și porniți serverul cu php -S localhost: 8888. Această comandă se traduce la "Rulați un server și îl accesați din browser-ul meu localhost, port 8888. "Continuați și încercați! Deschideți Google Chrome, căutați localhost: 8888, și veți vedea "Hello world * "pe pagina! Nifty! ecou este un construct de limbaj care nu face decât să emită o valoare dată.

Bacsis: MAMP și WAMP sunt soluții excelente cu un singur clic pentru instalarea PHP, MySQL și Apache pe computerul dvs. Mac sau PC, fără a fi nevoie să faceți clic pe linia de comandă. Ele pot fi alegeri utile în primele etape ale învățării.

WampServer este un mediu de dezvoltare care permite instalarea cu un singur clic a PHP, Apache și MySQL.

Desigur, acest lucru nu este cel mai interesant lucru din lume. De fapt, probabil că te gândești singur la tine "De ce nu am putut scrie "Hello world" direct în pagina HTML și elimina nevoia de PHP toate împreună?"Este adevărat, pentru acest exemplu, nu are nici un scop. Cu toate acestea, un limbaj de scripting ca PHP devine deosebit de util atunci când ieșirea ar trebui să fie dinamic în natură. lume, doriți ca mesajul de salut să facă trimitere la o valoare transmisă prin interogarea de interogare a adresei URL (textul din bara de adrese care vine după semnul întrebării). Iată un exemplu actualizat, care realizează exact acest lucru!

 

Asta aduce câteva tehnici noi. În primul rând, perioada unică care separă Salut șir și confuz $ _GET vă permite să concatenați (sau să grupați) valorile. În acest caz, dorim să imprimați "Bună ziua, * "și apoi valoarea reprezentată de $ _GET [ 'persoană']. Aceasta este ceea ce noi numim o matrice super-globală. Din motive de simplitate, gândiți-vă la acest lucru ca pe o cale de a * GET o valoare din stringul de interogări al adresei URL.

Testați acest lucru prin încărcare localhost: 8888 / persoana = Joe. Dacă este configurat corect, pagina web ar trebui să afișeze acum "Bună, Joe."Joacă-te cu el prin înlocuire Joe cu propriul nume. Observați cum se actualizează ieșirea de fiecare dată când pagina este actualizată? Acest lucru pur și simplu nu ar fi posibil cu static HTML.

Una dintre cheile programării mature analizează fiecare cale posibilă prin codul dvs. De exemplu, dacă nu persoană cheie este disponibil? Poate că șirul de interogare a fost omis în întregime. În acest caz, o eroare va fi cu siguranță aruncată, întrucât persoană cheia nu va exista. Care este soluția? Deși este adevărat că acest lucru nu este altceva decât un exemplu simplu, este încă important să luăm în considerare toate rezultatele posibile. Să furnizăm o valoare implicită.

 

Deși există modalități mai eficiente pentru a permite acest lucru, exemplul de mai sus este un excelent punct de plecare. De asemenea, este prima dvs. introducere în declarațiile condiționate. Abordați-vă codul în același mod în care ați putea trata scenarii în viața reală. De exemplu, "Dacă nu mai avem lapte, mergeți la magazin. În caz contrar, stați acasă."Această linie de gândire ar putea fi tradusă în PHP, folosind următoarea logică:

$ outOfMilk = adevărat; dacă ($ outOfMilk) echo 'Mergând la magazin.';  altceva echo 'Micul dejun este servit.' 

În acest bit de cod, numai o singură linie de text va fi imprimată pe ecran. Valoarea variabilei (o valoare dinamică), $ outOfMilk, va determina fluxul de control.

Bacsis: Pentru a declara variabile în PHP, precede orice nume cu un semn de dolar. Ca o bună practică, optează pentru nume de variabile care pot fi citite peste alternative criptice.

Revenind la exemplul anterior, atâta timp cât $ _GET [ 'persoană'] este setat (gândiți-vă la acest lucru ca un pseudo-nume pentru "este disponibil"), apoi creați un nou persoană $ variabilă egală cu valoarea sa. Altfel, aplicați o valoare implicită. Dacă reveniți la browser, acesta ar trebui să funcționeze corect, indiferent dacă acesta este persoană există cheia în interogarea de interogare.

Securitate

Din păcate, nu suntem încă liberi acasă. O bună practică de programare cheie este de a plasa securitatea în fruntea fiecărei acțiuni. Chiar și cu acest exemplu incredibil de simplu, am deschis ușa uneia dintre cele mai răspândite probleme de securitate de pe web: XSS (Cross-Site Scripting). O înțelegere adevărată a acestui lucru este absolut dincolo de sfera acestei lecții introductive (au fost scrise în întregime cărțile), dar aici este o ilustrare de bază: ce se întâmplă dacă $ _GET [ 'persoană'] este egal cu, nu un șir, ci un scenariu?

http: // localhost: 8888 / persoana =

Deoarece această valoare nu a fost dezinfectată, la execuție, în unele browsere, va fi afișată o casetă de alertă.

Browserele bazate pe Webkit (cred că Chrome și Safari) oferă acum protecție împotriva acestor tipuri de atacuri. Cu toate acestea, acest lucru nu a fost întotdeauna cazul, și încă nu este în Firefox și Internet Explorer.

Hopa! Nu putem avea asta. În timp ce societatea modernă dictează că un om este nevinovat până când se dovedește vinovat, același lucru nu este valabil și pentru lumea programării. Toți utilizatorii sunt vinovați până când sunt dezinfectați! Iată un exemplu actualizat care face acest lucru:

 

Cu această modificare, dacă cineva va încerca un atac XSS, vom fi gata! htmlspecialchars este o funcție nativă PHP care traduce diferite simboluri în contractele entității lor. & devine &, < devine <, etc Acest lucru face ca instrumentul perfect pentru a oferi acest pic mai mult de securitate.

Grozav; nici un rău făcut!


funcţii

În timp ce PHP navează cu o mulțime de funcții native, cu siguranță vor exista momente când veți avea nevoie de dvs. Din fericire, ei sunt un cinch pentru a scrie.

Gândiți-vă la o funcție ca o piesă de logică reutilizabilă care poate fi extrasă, astfel încât aceasta să poată fi identificată și apelată, folosind un nume lizibil.

Poate că conduceți un club de noapte (nu este probabil dacă citiți acest lucru!) Și aveți nevoie de o modalitate ușoară de a accepta data de naștere a unei persoane și de a calcula dacă are cel puțin douăzeci și unu de ani. O funcție personalizată ar fi o modalitate excelentă de a îndeplini această sarcină.

Primul pas este definirea unei noi funcții, numită isAdult. Funcțiile pot accepta intrarea externă, pe care apoi se poate acționa. Aceasta permite ca datele returnate din funcție să fie dinamice. În acest caz, pentru a determina dacă o persoană este adultă, trebuie să ne cunoaștem anul nașterii. Ultimul pas este de a reveni fie Adevărat sau fals, în funcție de faptul că anul curent minus data de naștere a persoanei este de cel puțin douăzeci și unu.

funcția isAdult ($ yob) $ currentYear = 2013; returnați $ currentYear - $ yob> = 21; 

Este foarte simplu! Acum, trebuie doar să-l dăm drumului la bouncer. O funcție poate fi declanșată sau apelată prin referirea numelui ei, urmată de un set de paranteze: isAdult (). Cu toate acestea, dacă funcția necesită un argument, atunci puteți să o specificați în aceste paranteze, după cum se arată mai jos:

dacă (isAdult (1985)) echo 'Haide!';  altceva echo 'Vă rugăm să părăsiți acum, înainte să-i sun pe mama ta.'; 

Există o problemă evidentă cu asta isAdult funcţie. Anul curent a fost greu codificat. Sigur, va funcționa pe tot parcursul anului 2013, dar ce se întâmplă anul viitor? Se pare că și această valoare trebuie să fie dinamică. PHP oferă o Data funcție, care poate fi utilizată pentru calcularea anului curent. Ca atare, funcția poate fi actualizată la:

funcția isAdult ($ yob) $ currentYear = date ('Y'); returnați $ currentYear - $ yob> = 21; 

Arrays

Repede câteva luni, iar acum, clubul de noapte se descurcă mai bine ca niciodată. De fapt, se face atât de bine până la punctul că bouncerul nu poate ține pasul. Munca lui ar putea fi mai ușoară dacă ar putea să se filtreze într-un grup de oameni la un moment dat.

Gândiți-vă la o matrice ca la un container pentru date conexe. Puteți chiar să vă referiți la ea ca pe o listă: o listă de tweets, un grup de membri ai familiei, o serie de date de naștere.

O matrice din cea mai recentă versiune a PHP (5.4) poate fi definită folosind o listă separată prin virgulă în paranteze, după cum urmează:

$ grup = [1985, 1990, 1992, 1997];

Acest singur grup de $ variabilă conține mai multe date de naștere. Valorile din cadrul acestuia pot fi accesate prin specificarea unui index, cum ar fi grup $ [0]. Arrays sunt ceea ce numim zero. În traducere, aceasta înseamnă că primul element sau cheia din matrice va avea un indice de zero. Ca atare, pentru a accesa valoarea din 1992, te-ar referi grup $ [2].

Acum, bouncerul poate filtra rapid aceste date de naștere și poate calcula dacă să le permită sau să le respingă. A pentru fiecare instrucțiunea poate fi utilizată pentru acest tip de filtrare.

$ grup = [1985, 1990, 1992, 1997]; foreach ($ grup ca $ yob) if (isAdult ($ yob)) echo 'Haide!';  altceva echo 'Vă rugăm să părăsiți acum, înainte să-i sun pe mama ta.'; 

Observați cum bouncer declară că anul nașterii pentru fiecare persoană în grup ar trebui să fie conținute în variabila, $ yob. Apoi, așa cum a făcut înainte, el trece acea valoare de la isAdult funcție, și procedează corespunzător.

Este posibil, totuși, că bouncerul va deveni confuz dacă nu are o legătură între anul nașterii persoanei și numele ei. De asemenea, PHP permite matricea asociativă, care oferă funcționalitatea necesară pentru a asocia o valoare dată cu o cheie. Iată un exemplu:

$ group = ['John' => 1985, 'Susan' => 1990, 'Joe' => 1992, 'Sara' => 1997];

Asa e mai bine. Ca un bonus suplimentar, bouncer poate fi un pic mai prietenos cu persoana, acum că el știe numele lui sau ei.

$ group = ['John' => 1985, 'Susan' => 1990, 'Joe' => 1992, 'Sara' => 1997]; foreach ($ grup ca $ nume => $ yob) if (isAdult ($ yob)) ecou "Haideți, $ nume!";  altceva echo "Vă rugăm să părăsiți acum, $ name, înainte de a apela mama ta."; 

Când se stochează șiruri în ghilimele duble, este posibil să inserați variabile mai degrabă decât să utilizați concatenarea. Acest lucru se poate impune pentru o sintaxă mai ușor de citit.


Clase

Programarea orientată pe obiecte este mult dincolo de scopul acestui tutorial, dar, totuși, clasele merită o mențiune. Pentru moment, gândiți-vă la ele ca containere simple pentru proprietăți și metode conexe. De exemplu, iată cum poate arăta o clasă care reprezintă o singură persoană:

persoana de clasă public $ name; vârsta publicului; funcția publică __construct ($ name, $ age) $ this-> name = $ name; $ this-> age = $ age; 

Observa asta __construi() metodă? Aceasta este menționată ca o metodă magică și va fi declanșată imediat după instanțiere. Atunci când această metodă se declanșează, va accepta un nume și o vârstă, apoi atașați-o la obiect.

Pentru a utiliza această clasă, încercați:

$ me = o persoană nouă ("Jeffrey", 28);

Aceasta va crea o nouă instanță a Persoană clasă. Această instanță, care este stocată în $ me variabilă, poate fi numită obiect. Acum, nimic nu te interzice să creezi mai multe exemple ale acestei clase - și, de fapt, în proiectele din lumea reală, o vei face! Clasa este doar un plan.

În acest moment, totuși, clasa nu este prea utilă. Să adăugăm o metodă sau o funcție pentru a desemna soțul unei persoane.

persoana de clasă public $ name; vârsta publicului; soț / soție publică; funcția publică __construct ($ name, $ age) $ this-> name = $ name; $ this-> age = $ age;  funcția publică se căsătorește (persoana $ soț) $ this-> soț = soț / soție;  $ me = o persoană nouă ("Jeff", 28); $ ea = o nouă Persoană ("Allison", 28); $ Me-> se căsătorească ($ ea);

Acest cod modificat include acum a mărita () metoda care va actualiza a $ soț proprietatea asupra obiectului. Acum, aveți o legătură directă între cei doi oameni.

Dacă un argument de metodă este precedat de un nume de clasă (Persoană soț / soție), denumită sugestie de tip, aceasta indică faptul că parametrul trebuie să fie o instanță a clasei date sau o eroare va fi aruncată.

Pentru a aduce numele soțului meu, puteți scrie:

echo $ me-> soț / soție-> nume; // Allison

Conceptul programării orientate pe obiecte merge mult mai profund decât acesta, dar păstrați-l simplu pentru moment. Aceasta ajută la gândirea la clase ca substanțe singulare: un tweet, un utilizator, un client sau un fișier.

Adevărata apreciere pentru acest model va veni doar cu timpul.

Mainile pe

Puneți-vă noile abilități găsite la încercare. Cum poți să înregistrezi și să afișezi tweets pentru un utilizator pe pagină? Ei bine, primul pas ar putea fi definirea unei clase care să reprezinte un singur Tweet. Această clasă ar trebui să stocheze proprietățile pentru corpul tweet-ului, precum și data publicării acestuia. În plus, ar trebui să se asigure că corpul tweet-ului nu depășește 140 de caractere. Iată o primă lovitură la o astfel de clasă:

clasă Tweet public $ body; public $ pubDate; funcția publică __construct ($ body) $ this-> setBody ($ body); $ this-> setPubDate (new DateTime);  funcția publică setBody ($ body) if (strlen ($ corp)> 140) arunca noua InvalidArgumentException;  $ this-> body = $ body;  funcția publică setPubDate (DateTime $ date) $ this-> pubDate = $ date-> format ('Y / m / d H: i: s'); 

Deși ar putea părea inițial copleșitoare, dați acest fragment de cod un pic de studiu și încercați să înțelegeți ce se întâmplă în fiecare etapă a drumului. S-ar putea să știți că este destul de lizibil!

O nouă parte interesantă de funcționalitate provine din setBody metodă. Dacă textul furnizat depășește 140 de caractere, pe care le putem calcula folosind PHP-urile strlen funcția, atunci ar trebui să luăm excepție la acest lucru, deoarece încalcă regulile unui tweet. O excepție poate fi aruncată folosind sintaxa, aruncați ExceptionType nou.

Acum, când avem un container destul de decent pentru un tweet, putem să creăm câteva tweets, să le stocăm într-o matrice și apoi, în cele din urmă, să le facem pe pagină, folosind pentru fiecare afirmație.

$ tweets = []; # adăugați două tweeturi noi la matricea $ tweets [] = nou Tweet ("Mergeți la magazin."); $ tweets [] = nou Tweet ("Înapoi de la magazin!"); # Filtrați prin și afișați pe pagină. foreach ($ tweets ca $ tweet) ecou "

$ Tweet-> corp

"ecou"

Postat pe: $ tweet-> pubDate

";

Când vizualizați ieșirea în browser, ar trebui să vedeți ceva în conformitate cu:

Excelent, dar cum salvez aceste tweets?


Depozitare

Până acum, ați învățat elementele esențiale: variabile, condiționalități, funcții, tablouri, clase. Mai sunt multe de acoperit, dar ar trebui să cercetați asta pe cont propriu, după cum este nevoie. Următorul pas în învățare este persistența. De exemplu, cum puteți păstra un jurnal al tuturor tweeturilor? Un serviciu de tweet care nu tine minte tweets este unul teribil! Aceasta este momentul în care ideea de baze de date intră în joc.

Gândiți-vă la o tabelă de baze de date ca o foaie de calcul Excel. Poate avea oricare număr de câmpuri, cum ar fi numele persoanei, vârsta sau adresa poștală. Cu toate acestea, PHP nu oferă acest tip de stocare nativă. În schimb, cea mai comună opțiune este MySQL, care este cea mai populară bază de date open source din lume.

Instalarea MySQL nu intră sub incidența acestui tutorial. În schimb, consultați acest tutorial pe Nettuts + pentru o plimbare completă.

Iată un exemplu simplificat pentru a începe să preluați rândurile în siguranță dintr-o tabelă de baze de date. Nu vă faceți griji dacă pare copleșitoare. MySQL este a doua limbă nouă de învățat. API-ul PDO al PDA, precum și limba de interogare, în sine, necesită timp pentru a învăța.

În primul rând, veți avea nevoie de o modalitate de a vă conecta la baza de date.

function connect () $ conn = nou PDO ('mysql: host = localhost; dbname = DB_NAME', 'USERNAME', 'PASSWORD'); $ conn-> setAttribute (DOP :: ATTR_ERRMODE, DOP :: ERRMODE_EXCEPTION); returnează $ conn; 

PDO este unul dintre cele trei API-uri disponibile pentru conectarea la o bază de date MySQL.

Apoi, vom adăuga o funcție de ajutor pentru a prelua toate înregistrările din tabelul de tweets. Acordați o atenție deosebită întrebare argumentul metodei, SELECT * FROM tweet-uri. Aceasta este o limbă specială pentru interogarea bazei de date. În acest caz, folosim * simbol pentru a face referire la toate rândurile. Ca atare, selectăm toate rândurile din tabel tweeturi.

Această funcție pregătește interogarea și apoi aduce întregul set de rezultate.

funcția fetchTweets ($ conn) $ stmt = $ conn-> interogare ('SELECT * FROM tweets'); returnați $ stmt-> fetchAll (PDO :: FETCH_OBJ); 

Acum, cu setul de scenă, trebuie doar să sunăm funcțiile, în consecință.

# Conectați-vă la DB $ conn = connect (); # Returnați toate rândurile din tabela de participanți var_dump (fetchTweets ($ conn));

O modalitate ușoară de a arunca conținutul unei variabile este prin utilizarea var_dump funcţie. Dacă treceți ieșirea din fetchTweets ($ conn) la această funcție, când îl vizualizați în browser, veți vedea ceva după cum urmează:

var_dump este util pentru depanare, dar din motive de producție, este mai bine să filtrați rezultatele și să le faceți corect pe pagină. pentru fiecare declarație, pe care deja o cunoașteți, se va ocupa foarte bine de slujbă!

$ tweets = fetchTweets ($ conn); foreach ($ tweets ca $ tweet) ecou "

$ Tweet-> corp

"ecou"

$ Tweet-> pubDate

";

Concluzie

Ca și în cazul oricărei abilități, scrierea fluentă PHP nu necesită nimic mai mult decât timpul tău. S-ar putea să dureze sute de ore pentru a face groază, dar e în regulă. E distractiv, nu? Ar trebui să fie!

Cel mai bun mod de a învăța este de a face. Construiți aruncați proiecte ca și cum acestea vor ieși din stil! Tehnicile prezentate în acest tutorial vă vor duce în prima fază, dar, desigur, pe măsură ce progresează abilitățile, veți trece la subiecte mai avansate, cum ar fi cadre PHP, modele de design și dezvoltare bazată pe teste. A se distra!

Sugestii Tuts + Resursă Premium

  • Modern PHP Developer
  • Bazele PHP
  • SQL Essentials
Cod