Oop în clase php, instanțe de clasă, domenii, metode și constructori, blog-ul dezvoltatorilor web

Oop în clase php, instanțe de clasă, domenii, metode și constructori, blog-ul dezvoltatorilor web
După cum ați aflat din articolul precedent. clasa este o descriere a unor obiecte similare. În acest articol, vom examina detaliat exemplele, cum vor fi stocate datele pe care instanța clasei le va stoca, precum și comportamentul acestora, adică metodele, vor fi descrise.







Descrierea clasei și crearea instanței

Definiția clasei în PHP începe cu clasa de cuvinte cheie. Apoi urmează numele clasei. Clasele de numire sunt luate cu o majusculă. După numele clasei, parantezele curbate descriu membrii clasei - câmpurile (datele) și metodele.

Crearea unei instanțe a unei clase nu este diferită de scrierea rezultatului funcției unei funcții într-o variabilă, cu excepția folosirii noului cuvânt cheie.

$ instanțăClass = nouClassName ();

Câmpuri de clasă

Când descrieți câmpurile de clasă, trebuie să specificați un calificativ de acces, un cuvânt cheie care va determina domeniul de aplicare al câmpului la care se referă. În php există trei specificatori de acces: public. protejate și private. publice Specificator pot accesa de oriunde pe teren, protejat - numai clase în picioare în același lanț de moștenire (de la clasa descendent, de la copii copiilor, etc.) și privat interzice accesul de pretutindeni, cu excepția clasei. După calificativul de acces, numele câmpului precedat de semnul dolarului merge.

Noi nu va lua în considerare această sintaxă în detaliu, ca învechite, dar trebuie să știe despre ea, pentru că într-un moment în care versiunile mai vechi ale PHP au fost relevante, a fost scris de neimaginat cantitate de cod, și este încă folosit în multe proiecte. Cu această sintaxă, câmpurile de clasă sunt accesibile din exterior, ca și cum ar fi fost declarate publice cu specificatorul de acces.

Pentru a accesa câmpurile din clasă, utilizați simbolul "->". Numele câmpului la care vrem să ne referim este scris fără semnul dolarului. Câmpurile sunt disponibile din afara clasei în acest caz, deoarece folosim specificatorul de acces public.

$ user = utilizator nou (); $ user-> login = 'true-coder'; $ user-> parola = 'qwerty'; echo "Login: $ user-> login
"// Login: true-coder" Parola: $ user-> password "; // Parola: qwerty

Valoarea câmpului din clasa prestabilită este nulă:

$ user = utilizator nou (); echo "Login:" .getType ($ user-> login). "
"// Login: NULL" Parola: ".getType ($ user-> password); // Parola: NULL

În php, este permisă trimiterea la un câmp al cărui nume este conținut într-o variabilă de șir:

$ user = utilizator nou (); $ propertyName = 'login'; $ user -> $ proprietăți = 'true-coder'; $ propertyValue = $ user -> $ proprietateName; echo "$ propertyName: $ propertyValue"; // login: true-coder

Această funcție vă permite să determinați numele câmpului la care doriți să accesați, în funcție de diferite condiții.

Accesul la un câmp inexistent (proprietate) în PHP nu cauzează o eroare și dacă atribuiți o valoare acestui câmp, acesta va fi salvat în instanța obiectului. Astfel de câmpuri sau proprietăți sunt numite determinate dinamic.

$ p = punct nou (); $ p-> z = 10; echo "z: $ p-> z"; // z: 10

O astfel de tehnică este considerată o formă proastă, deoarece declarând câmpurile din clasă, raportăm ce date vor fi stocate în instanțe din această clasă. Pentru proprietăți definite dinamic, nu putem garanta existența lor în instanță.







În practică, un astfel de cod, ca în clasele Utilizator sau Punct, nu este acceptabil. Accesul la câmpurile de clasă, cu rare excepții, este necesar prin metode, iar câmpurile în sine sunt făcute inaccesibile în afara clasei sau lanțului de moștenire. În plus, este incomod să atribuim valori câmpurilor după crearea obiectului.

Metode de clasă

Așa cum am spus mai devreme, metodele descriu comportamentul instanțelor unei clase, adică acțiunile pe care le pot realiza. Descrierile metodei din clasă, ca și descrierea câmpului, încep cu un calificator de acces, urmat de cuvântul cheie funcțional. numele metodei și lista de parametri în paranteze. În interiorul metodei, puteți accesa instanța curentă a clasei cu cuvântul cheie $ this. care, spre deosebire de multe alte limbi de programare, este scris în PHP cu un semn de dolar. În afara clasei, metodele sunt numite cu numele instanței clasei. Ca și pentru accesarea câmpurilor, simbolul "->" este folosit pentru a apela metodele.

Să presupunem că avem o clasă care descrie dreptunghiuri cu câmpuri care stochează înălțimea și lățimea și cu o metodă care numără aria dreptunghiului.

Creați o instanță a acestei clase și apelați metoda getArea:

$ rect = dreptunghi nou (); $ rect-> width = 15; $ rect-> înălțime = 20; echo $ rect-> getArea (); // 15 * 20 = 300

Ca și funcții, metodele de clasă pot lua parametrii. Să extindem ușor clasa Rectangular. adăugând coordonatele colțului din stânga sus și metoda translateTo spre dreptunghiul de transfer la punctul specificat:

Creăm o instanță a clasei, atribuim câmpurile de valoare și sunăm metoda translateTo cu câțiva parametri:

$ rect = dreptunghi nou (); $ rect-> width = 15; $ rect-> înălțime = 20; $ rect-> x = 10; $ rect-> y = 20; echo "Coordonate înainte de mutare:
"." x: $ rect-> x
"/ / x: 10" y: $ rect-> y
"; // y: 20 $ rect-> translateTo (30, 40); echo" Și după:
"." x: $ rect-> x
"// x: 30" y: $ rect-> y "; // y: 40

constructori

$ rect = dreptunghi nou (10, 20, 100, 200); echo "x: $ rect-> x
"/ / x: 10" y: $ rect-> y
"/ / y: 20" Lățime: $ rect-> lățime
"// Lățime: 100" Înălțime: $ rect -> înălțime
"; / Înălțime: 200

În versiunile mai vechi ale php, numele constructorului ar fi trebuit să fie același cu numele clasei, adică în cazul nostru ar arăta astfel:

Aceasta este o sintaxă învechită și nu ar trebui utilizată.

Încă o dată, repet că un astfel de cod, ca în exemplele de mai sus, merită scris doar ca un instrument de învățare. Câmpurile publice încalcă principiul încapsulării și, datorită accesului liber la acestea din afară, le putem strica valorile. Veți învăța cum să furnizați acces securizat la câmpurile de clasă în următorul articol din această serie.

Câmpuri statice și metode, constante

clasa Klass funcția statică publică getCount () > $ instanțe = array (); pentru ($ i = 0; $ i <10; $i++) <$instances[] = new Klass();> echo "Numărul de instanțe ale clasei:" .Klass :: getCount () ".
"; // 10 $ instanță = nou Klass (); echo" Număr după crearea unui alt obiect: "Klass :: getCount (); // 11

Rețineți că încercarea de a schimba câmpul de numărare din afara clasei va provoca o eroare, deoarece acest câmp este scris cu specificația accesului privat.

// Eroare fatală: Nu puteți accesa proprietatea privată Klass :: $ count in ... Klass :: $ count = -10;

Constanta este de asemenea disponibilă din afara clasei:

echo Klass :: CONSTANT_NAME; // 100500

Câteva cuvinte despre cod

În php, complexitatea constă în faptul că funcțiile, clasele, metodele și variabilele native sunt numite în diferite stiluri. Comparați: DateTime. in_array. $ _POST. $ GLOBALS. Prin urmare, nu puteți face codul în mod ideal uniform, dar vă puteți numi propriile funcții, clase, metode și variabile într-un singur stil.

Despre asta, poate, până când terminăm. În cele din urmă, vreau să observ că înțelegerea unor lucruri poate veni cu timpul în timpul practicii. Prin urmare, sfatul meu să vă scrieți, să scrieți și să scrieți din nou codul. Să fie inutil, să fie de slabă calitate, să nu fie folosit în proiecte reale, dar veți obține o experiență neprețuită.

Și, ca de obicei, vă urez succes!

Vă mulțumim pentru articolul interesant.

Te rog, Dmitry. Mă bucur că ți-a plăcut.

Și ce se utilizează pentru a evidenția codul? Ce plugin? Sau ați codat manual codul?

Vă mulțumesc foarte mult, foarte clar și de înțeles.
Nu înțeleg decât un singur lucru:
-există un designer
funcția publică __construct ($ x, $ y, $ z) $ this-> x = $ x; // aici este clar
...
>
adică acele valori care sunt predefinite în __construct nu mai sunt necesare
determină în funcții (metode)
De exemplu:
funcția publică coolMix ($ x, $ y) $ this-> x = $ x; // nu este nevoie, da?
$ this-> y = $ y // nu este nevoie, da?
>

Nu, nu este necesar să redefinim în câmpurile de metode care au fost inițializate în constructor.

Se va schimba ceva dacă creez un exemplu fără paranteze, de exemplu: $ engine = new Engine; ?







Articole similare

Trimiteți-le prietenilor: