Php oop ce este un parametru într-o metodă. OOP în PHP: Introducere

" Va fi util atât pentru începătorii completi, cât și pentru cei care sunt deja destul de buni la scrierea de cod non-orientat pe obiect și vor să afle de ce este încă nevoie de OOP.

Ceea ce m-a făcut să scriu mai multe articole despre OOP în php a fost faptul că nu am găsit articole pe această temă care să mă mulțumească. Există manuale sau articole oficiale seci și plictisitoare care prezintă în esență aceleași manuale doar cu mai multe exemple detaliate, există și o mulțime de informații învechite pe acest subiect pe Internet.

De ce ai nevoie de OOP?

Popularitatea și simplitatea PHP duce la faptul că majoritatea codului scris în acest limbaj este de o calitate foarte dubioasă. Cu doar puțin timp liber învățând acest limbaj și puțină perseverență, chiar dacă nu ești familiarizat cu programarea, poți începe să scrii aplicații web. Ca învățarea php le poți face mai funcționale. Cu toate acestea, dacă nu ți-ai făcut timp pentru a proiecta, vei face în curând funcții suplimentareîn aplicație, depanarea și testarea acesteia devin mai complicate și pentru a adăuga ceva mic, trebuie să stârniți o cantitate din ce în ce mai mare de cod, devine din ce în ce mai de neînțeles și mai confuz, alți dezvoltatori, familiarizați cu codul dvs., vor începe să înjură şi critică aspru.

Ilustrație din cartea „ Cod curat" - Robert Martin

Deci care e problema? De ce proiectul pe care îl aveți în minte, atunci când este extins, se poate transforma atât de repede într-o grămadă de coduri confuze cu un nor de bug-uri? Faptul este că începătorii scriu cod care face doar ceea ce se cere de la el într-o situație specifică și nu implică efectuarea de modificări. Această abordare nu este acceptabilă, mai ales pentru aplicațiile web, care vor trebui inevitabil să crească și să se dezvolte dacă, desigur, vor deveni populare. Mai devreme sau mai târziu, dvs. și poate alți dezvoltatori, va trebui să vă întoarceți la codul scris anterior și să faceți modificări la acesta și, cu cât este mai ușor să faceți acest lucru, cu atât aplicația dvs. se va dezvolta mai repede și va câștiga popularitate.

Abordarea orientată pe obiect a programarii, desigur, nu este un panaceu pentru toate bolile și prin ea însăși nu vă va îmbunătăți codul, dar utilizarea sa vă va permite să prezentați codul nu ca o grămadă de funcții și variabile, ci ca o colecție de obiecte care interacționează între ele, ceea ce este mult mai clar. Datele nu vor rămâne nicăieri - vor fi stocate în obiecte, protejându-le de utilizare greșită. Funcțiile (în programarea orientată pe obiecte sunt numite metode) nu vor efectua doar acțiuni cu variabile, ci vor descrie comportamentul obiectelor. În esență, aceasta implică modelarea entităților reale, cum ar fi un utilizator, o postare, un comentariu la acesta și așa mai departe.

În plus, așa-numitele modele de design sunt comune în OOP - modele pentru rezolvarea unei probleme care apare constant în programare. Utilizarea acestor șabloane vă va permite, în primul rând, să cunoașteți deja soluția unei anumite probleme înainte de a apărea, iar în al doilea rând, soluția problemei va fi clară pentru alți dezvoltatori familiarizați cu șablonul pe care l-ați folosit.

Concepte de bază

OOP este o metodologie de programare (metodă, abordare) conform căreia produs software este reprezentată sub formă de obiecte care interacționează. Nu sunt de acord că OOP implică întotdeauna utilizarea claselor - js este ca un limbaj orientat pe obiecte, dar nu are clase. Cu toate acestea, atunci când se aplică la php OOP implică întotdeauna folosirea claselor.

Sub obiect De obicei, este înțeles ca o anumită entitate numită care stochează date și are propriul comportament. Comportamentul unui obiect și structura datelor pe care le stochează, precum și modul în care sunt accesate aceste date, descrie clasa căreia îi aparține obiectul. Clasă Aceasta este o descriere a obiectelor oarecum similare, înrudite, care stochează de obicei același set de date și au același comportament. Un obiect care aparține unei anumite clase este numit copie. Un exemplu este o clasă care descrie un utilizator. Această clasă descrie structura de date pe care o va stoca fiecare instanță a acestei clase. Lăsați aceste date să fie numele dvs. de conectare și parola. Un obiect de clasă care stochează anumite valori de conectare și parolă va fi o instanță a acestei clase.

Trei piloni ai POO


OOP se bazează pe trei principii, adesea numite cei trei piloni ai POO, acestea sunt:

  • încapsulare
  • polimorfism
  • moştenire

Încapsulare este principiul conform căruia datele sunt combinate și stocate în obiecte și sunt, de asemenea, protejate de utilizarea incorectă.

Vi se poate părea ciudat că programatorul își limitează drepturile de citire sau modificare a datelor, dar se întâmplă adesea să fie foarte dificil să urmăriți și să înțelegeți complet cum funcționează codul și, prin urmare, merită să evitați situațiile care sunt evident. eronat.
Un exemplu de utilizare greșită a datelor ar fi încercarea de a atribui o vârstă negativă unei instanțe a clasei Persoană. Desigur, o astfel de încercare, cu cod bine scris, nu ar trebui să aibă succes, altfel principiul încapsulării va fi încălcat.
În practică, principiul încapsulării este că datele sunt accesate folosind metode care pot filtra sau ajusta valorile datelor pe care încercăm să le schimbăm.

Moştenire este procesul prin care un tip de obiect (clasă) dobândește anumite proprietăți ale altui tip de obiect.

Se întâmplă adesea ca descrierea unui tip de obiect, adică a unei clase, să se încadreze complet sub descrierea unui alt tip de obiect. De exemplu, o clasă care descrie un administrator ar putea descrie și un utilizator, cu excepția faptului că utilizatorul nu are drepturi de acces. În acest caz, este logic să creați o clasă care să descrie administratorii, descendent clasa care descrie utilizatorii. În același timp, în clasa care descrie administratorii, nu trebuie să descriem datele și comportamentul care sunt deja descrise în clasa „utilizator” trebuie doar să descriem datele care vor fi responsabile pentru acordarea drepturilor de acces; În acest caz clasa „utilizator” va fi strămoş clasa „administrator”, care poate avea propriul copil, iar acel copil poate avea propriul său etc. Lanțul de moștenire poate fi atât de lung cât se dorește. În plus, un strămoș poate avea mai mulți descendenți, fiecare dintre care va dobândi complet proprietățile strămoșului său și le va adăuga ceva propriu, altfel moștenirea este lipsită de sens.

Polimorfism este utilizarea aceluiași nume de metodă pentru a rezolva mai multe probleme similare.

Este firesc să folosiți același nume de metodă pentru aceeași acțiune cu diferite tipuri de obiecte ale aceluiași lanț de moștenire. Implementarea acestei metode poate diferi în fiecare clasă și prin apelarea metodei nu vom ști Cum face ceva, dar vom ști Ce o face pe baza numelui său. Să revenim la exemplul nostru cu utilizatorul și administratorul. Atât administratorul, cât și utilizatorul se pot autentifica și pot alege în mod natural un nume de metodă pentru această acțiune, de exemplu LogIn. Implementarea sa specifică în aceste clase poate diferi, de exemplu, în timpul autorizării înregistrăm drepturile de acces ale administratorului la sesiune, dar nu și pentru utilizator. Când scriem cod care prelucrează datele primite din formularul de cod, după crearea unei instanțe a clasei, nu va conta pentru noi dacă se conectează un simplu utilizator sau un administrator - pentru o instanță a oricăreia dintre aceste două clase, vom numi un metoda cu acelasi nume.

E destul de plictisitoare teorie. Data viitoare voi scrie despre cum să descriu clasele, să creez instanțe de clasă, să accesez date (câmpuri) și metode ale instanțelor.

Dacă găsiți erori critice în traducere, vă rugăm să lăsați comentarii. Comentariile tale vor fi luate în considerare cu siguranță. Oricum, sper sa gasesti acest articol foarte util.

Există multe exemple diferite și simple care arată cum funcționează OOP. Astăzi am decis să vă arăt cum funcționează OOP (programare orientată pe obiecte) V viata reala; în special acest exemplu util pentru programatorii începători. Prin crearea unei clase sub MYSQL CRUD (CRUD - create read update delete - „Creation read update delete”), puteți crea, citi, actualiza și șterge cu ușurință înregistrări în oricare dintre proiectele dvs., indiferent de modul în care este proiectată baza de date.

Odată ce înțelegeți de ce avem nevoie, puteți crea cu ușurință un schelet pentru clasa noastră. În primul rând, trebuie să includem în clasă funcțiile de bază pentru lucrul cu MySQL. Următoarele caracteristici sunt necesare.

  • Selecta
  • Introduce
  • Şterge
  • Actualizare
  • Conectați-vă
  • Deconecta

Mai jos este definiția clasei noastre. Rețineți că toate metodele pe care le-am creat folosesc cuvânt cheie public

Baza de date de clasă ( public function connect() ( ) public function disconnect() ( ) public function select() ( ) public function insert() ( ) public function delete() ( ) public function update() ( ) )

funcția connect().

Această funcție va fi destul de simplă, dar înainte de a scrie funcția, va trebui să definim câteva variabile. Variabilele ar trebui să fie accesibile numai în cadrul clasei, astfel încât fiecare variabilă este precedată de cuvântul cheie privat. Toate variabilele (gazdă, nume de utilizator, parolă, numele bazei de date) sunt folosite pentru a se conecta la baza de date Date MySQL. După aceasta, putem crea un simplu interogare MySQL la baza de date. Desigur, ca programatori, ar trebui să ne așteptăm la orice de la utilizatori și, pe baza acestui lucru, trebuie să luăm anumite măsuri de precauție. Putem verifica: dacă utilizatorul este deja conectat la baza de date, atunci, în consecință, nu trebuie să se reconecteze la baza de date. În caz contrar, putem folosi datele de conectare ale utilizatorului pentru a ne conecta.

Private db_host = ''; private db_user = ''; private db_pass = ''; private db_name = '';

/* * Conectați-vă la baza de date, este permisă o singură conexiune */ public function connect() ( if(!$this->con) ( $myconn = @mysql_connect($this->db_host,$this->db_user,$ this- >db_pass); if($myconn) ( $seldb = @mysql_select_db($this->db_name,$myconn); if($seldb) ($this->con = true; return true; ) else ( return false ; ) ) else ( returnează fals; ) ) else ( returnează adevărat; ) ) După cum puteți vedea mai sus, folosim funcții de bază MySQL și faceți o mică verificare a erorilor pentru a vă asigura că totul merge conform planului. Dacă utilizatorul s-a conectat la baza de date, returnăm true, în caz contrar returnăm false. Ca bonus suplimentar

setați variabila (con) la adevărat dacă conexiunea este stabilită.

Funcția publică deconectare()

Funcția verifică variabila de conexiune pentru a vedea dacă există. Dacă conexiunea este stabilită (con există), atunci închideți conexiunea la baza de date MySQL și returnați true . Altfel, nu trebuie să faci nimic.

Funcția publică disconnect() ( if($this->con) ( if(@mysql_close()) ( $this->con = false; return true; ) else ( return false; ) ) )

Funcție publică select() Să ajungem la partea în care lucrurile se complică puțin. Începem să lucrăm cu argumentele utilizatorului și returnăm rezultatele interogării. Nu trebuie să folosim rezultatele chiar acum, dar trebuie să creăm o variabilă în care vom stoca rezultate personalizate pentru interogările din baza de date. În plus, vom crea și noi caracteristică nouă , care va verifica dacă există acest tabel

Private $result = array();

/* * Verificați existența unui tabel la executarea unei interogări * */ private function tableExists($table) ( $tablesInDb = @mysql_query("SHOW TABLES FROM ".$this->db_name." LIKE "".$table ."" ; if($tablesInDb) ( if(mysql_num_rows($tablesInDb)==1) ( returnează adevărat; ) else ( returnează false; ) ) Această funcție verifică pur și simplu prezența masa dorită

în baza de date. Dacă tabelul există, va returna true, în caz contrar, va returna false.

/* * Preluarea informațiilor din baza de date * Obligatoriu: tabel (nume tabel) * Opțional: rânduri (coloane obligatorii, delimitator virgulă) * unde (coloană = valoare, transmisă ca șir) * ordine (sortare, transmisă ca șir) * / funcția publică select( $table, $rows = "*", $where = null, $order = null) ( $q = "SELECT ".$rows." FROM ".$table; if($where != null) ) $q .= " UNDE ".$unde; if($comanda != null) $q .= " ORDER BY ".$comandă dacă($this->tableExists($table)) ( $query = @mysql_query; ($q); if($query) ( $this->numResults = mysql_num_rows($interogare); for($i = 0; $i numResults; $i++) ( $r = mysql_fetch_array($interogare); $key = array_keys($r) ; for($x = 0; $x 1) $this->result[$i][$key[$x]] = $r[$key[$x]] else if(mysql_num_rows ($interogare) rezultat = null $this->result[$key[$x]] = $r[$key[$x]] ) return true ( return false; ) ) else return false;

) La prima vedere pare intimidant, dar în același timp facem o grămadă de lucruri importante aici. Funcția acceptă patru argumente, dintre care unul este necesar. Funcția va returna rezultatul cu un singur argument - numele tabelului. Cu toate acestea, puteți extinde numărul de argumente și puteți adăuga argumente noi pe care le puteți utiliza atunci când lucrați cu baza de date; la urma urmei, execuția corectă a funcției depinde de un singur argument - numele tabelului. Codul din funcție servește la compilarea tuturor argumentelor la interogarea select. De îndată ce interogarea este compilată, va trebui să verificați prezența tabelului necesar în baza de date - pentru aceasta este utilizată funcția tableExists. Dacă tabelul este găsit, funcția va continua și cererea va fi trimisă. În caz contrar, totul se va opri. Următoarea secțiune conține codul cu adevărat magic. Ideea este aceasta: colectați datele solicitate din tabel. Apoi atribuim rezultatul unei variabile. Pentru a simplifica rezultatul pentru utilizatorul final, în care prima cheie este un număr (increment), a doua cheie este numele coloanei. Dacă există un singur rând în tabel, acesta va reveni matrice unidimensională, numele cheilor corespund cu numele coloanelor din tabel. Dacă nu se găsesc rânduri în tabel, variabila rezultat va fi setată la null . După cum am spus mai devreme, totul pare puțin confuz, dar odată ce ați împărțit codul în secțiuni separate, totul devine mult mai simplu și mai clar.

funcția publică insert()

Această caracteristică este puțin mai simplă decât cele anterioare. Pur și simplu vă permite să introduceți informații în baza de date. Astfel, pe lângă numele tabelului, vom avea nevoie de argumente suplimentare. Vom avea nevoie de o variabilă care va conține valorile relevante pentru inserarea în tabel. Apoi vom separa fiecare valoare cu o virgulă. De asemenea, verificăm prezența tabelului dorit folosind funcția tableExists și creăm o interogare de inserare manipulând argumentele transmise funcției insert(). Apoi trimitem cererea noastră la adresa dorită.

/* * Inserați valori în tabel * Obligatoriu: tabel (numele tabelului) * valori (valori introduse, o matrice de valori este transmisă, de exemplu, * array(3,"Nume 4","Nume 4"," [email protected]");) * Opțional: * rânduri (numele coloanelor în care inserăm valorile este transmis ca șir, * de exemplu, „titlu,meta,date” * */public function insert($table,$values) ,$rows = null) ( dacă ($this->tableExists($table)) ( $insert = „INSERT INTO ".$table; if($rows != null) ( $insert .= " (".$rows) ."" ) pentru( $i = 0;< count($values); $i++) { if(is_string($values[$i])) $values[$i] = """.$values[$i]."""; } $values = implode(",",$values); $insert .= " VALUES (".$values.")"; $ins = @mysql_query($insert); if($ins) { return true; } else { return false; } } }

După cum puteți vedea, această funcție este destul de simplă în comparație cu compunerea selectați interogări la baza de date. De fapt funcția de ștergere va fi si mai usor.

Funcția publică delete()

Această funcție pur și simplu șterge un tabel sau rânduri din baza noastră de date. Astfel, trebuie să transmitem funcției numele tabelului și un argument opțional care definește condiția unde. În condiția care urmează cuvântului cheie WHERE, există o precizare: ștergeți un rând, rânduri sau întregul tabel. Dacă clauza where este omisă, atunci toate rândurile vor fi șterse. Apoi se face cererea de ștergere și cererea este executată.

/* * Ștergeți un tabel sau înregistrări care îndeplinesc condiția * Obligatoriu: tabel (numele tabelului) * Opțional: unde (condiție ), transmis ca șir, de exemplu, "id=4" */ public function delete($table, $unde = null) ( if($this->tableExists($table)) ( if($where == null) ( $delete = "ȘTERGERE ".$table; ) else ( $delete = "ȘTERGERE DIN ".$ tabel." WHERE " $unde ) $del = @mysql_query($delete if($del) ( return true; ) else ( return false; ) )

În cele din urmă, să trecem la ultima noastră funcție principală. Această funcție este utilizată pentru a actualiza un rând din baza de date informații noi. Această funcție la prima vedere greu de înțeles, însă, acest lucru nu este în întregime adevărat. Vom folosi toate aceleași principii ca înainte. De exemplu, argumentele vor fi folosite pentru a compune cererea de actualizare. Vom verifica, de asemenea, existența tabelului folosind metoda tableExists. Dacă tabelul există, actualizați rândul corespunzător. Cea mai grea parte, desigur, este acolo unde scriem cererea de actualizare. Deoarece instrucțiunea de actualizare are regula de a actualiza toate rândurile simultan, trebuie să luăm în considerare acest lucru și să ajustam acest punct în mod corect. Deci, am decis să trec condiția where ca o matrice simplă. Primul argument din această matrice este numele coloanei, următorul argument este valorile coloanei. Astfel, fiecare număr par (inclusiv 0) corespunde unui nume de coloană, iar fiecare număr impar conține o valoare impară. Codul relevant este mai jos:

Pentru($i = 0; $i

În secțiunea următoare, vom crea partea de actualizare a instrucțiunii prin configurarea variabilelor. Pentru că poți schimba orice valoare numerică, am preferat o matrice cu chei după numele coloanei și valori noi. Astfel, tot ce trebuie să facem este să verificăm tipul valorii și unde trebuie să punem virgula. Acum că am scris cele două părți principale ale instrucțiunii de actualizare, completarea instrucțiunii de actualizare nu este dificilă, codul este prezentat mai jos:

Actualizare funcție publică($tabel,$rânduri,$unde,$condiție) ( if($this->tableExists($table)) ( // Analizați unde valorile // valorile chiar (inclusiv 0) conțin unde rândurile // valorile impare conțin clauzele pentru rândul pentru ($i = 0; $i

Deci am terminat de creat ultima functie iar clasa noastră de lucru cu CRUD poate fi considerată completă. Acum puteți crea înregistrări noi, puteți citi înregistrări individuale din baza de date, puteți actualiza înregistrări și puteți șterge înregistrări. În plus, odată ce începeți să reutilizați această clasă, veți descoperi că economisiți timp și linii de cod semnificative. Adică veți simți eficacitatea și avantajul OOP.

Utilizare

Deci ne-am creat clasa, dar cum o folosim? Totul este simplu aici. Să începem prin a crea o bază de date simplă în care să ne testăm clasa. Am creat baza de date de teste și am compilat mysql simplu operator. Îl poți pune în orice bază de date.


Prima linie este comentată deoarece nu este întotdeauna necesar. Dacă trebuie să rulați codul anterior de mai multe ori, va trebui să decomentați prima linie pentru a vă asigura că tabelul este creat.

Acum că tabelul nostru este creat și populat, este timpul să rulăm câteva interogări simple.

conecta (); $db->select("mysqlcrud"); $res = $db->getResult(); print_r($res); ?>

Dacă totul este făcut corect, veți vedea următoarele:

În mod similar, putem rula o interogare de actualizare și putem scoate rezultatele.

update("mysqlcrud",array("name"=>"Schimbat!"),array("id",1),"="); $db->update("mysqlcrud",array("nume"=>"Schimbat2!"),array("id",2),"="); $res = $db->getResult(); print_r($res); ?>

Ieșire:

Acum doar introduceți intrarea:

insert("mysqlcrud",array(3,"Nume 4"," [email protected]")); $res = $db->getResult(); print_r($res); ?>

În acest tutorial veți învăța elementele de bază ale programării orientate pe obiecte în PHP. Veți afla despre principiile OOP în general și veți învăța cum să scrieți scripturi simple în PHP.

Bun venit la prima dintr-o serie de lecții despre POO în PHP! Prin finalizarea tuturor lecțiilor din această serie, veți afla despre principiile și conceptele de bază ale POO și veți învăța cum să creați rapid și ușor aplicatii utileîn PHP.

În acest tutorial voi începe să vă pun la curent și să vă spun despre conceptele de bază ale OOP. Vei invata:

  • ce este OOP
  • cum vă va ajuta OOP să creați cel mai bun PHP scenarii
  • câteva concepte de bază precum clase, obiecte, metode, variabile de clasă
  • de unde să încep scriind PHP scenariu

Sunteți gata să vă scufundați în lumea obiectelor PHP? Atunci dă-i drumul!

Ce este programarea orientată pe obiecte?

Dacă ați creat și folosit vreodată funcții personalizate în PHP, ați folosit un stil de programare procedurală. ÎN programare procedurală de obicei creați structuri de date - numere, șiruri, matrice etc. - să stocheze unele date, apoi să proceseze aceste structuri funcții speciale, care manipulează aceste date.

Programarea orientată pe obiecte, sau OOP, a avansat deoarece aici stocăm structurile de date și funcțiile care le procesează într-o singură entitate numită obiect. În loc să procesați datele cu o anumită funcție, încărcați acele date într-un obiect și apoi apelați metodele acestuia pentru a le manipula și a obține rezultatul dorit.

Cel mai adesea, obiectele create folosind POO reflectă entități reale. De exemplu, dacă creați un forum pentru site-ul dvs., veți crea un obiect Membru care va stoca informații despre fiecare membru al forumului (nume, autentificare, Adresa de e-mail, parola etc.), precum și metodele care vor prelucra aceste informații (înregistrare, autorizare, deconectare, interzicere etc.).

De ce să folosiți OOP?

Procedural și orientat pe obiecte sunt două moduri diferite face acelasi lucru. Acest lucru nu înseamnă că una dintre ele este mai bună decât cealaltă - fiecare scrie așa cum vrea, așa că puteți chiar să combinați cu ușurință aceste două abordări într-un singur scenariu.

Cu toate acestea, iată câteva beneficii ale OOP pentru dezvoltatori:

  • Este mai ușor să reflectați situații reale: așa cum am menționat mai sus, obiectele reflectă entități reale - oameni, produse, carduri, articole de blog etc. Acest lucru simplifică foarte mult sarcina atunci când abia începeți să vă proiectați aplicația, deoarece scopul fiecărui obiect. este ca un scop relațiile dintre obiecte vor fi clare și de înțeles.
  • Este mai ușor să scrieți programe modulare: OOP implică scrierea de module. Împărțind codul în module, vă va fi mai ușor să îl gestionați, să îl depanați și să îl extindeți.
  • Este mai ușor să scrieți cod care va fi folosit de mai multe ori: scrierea unui cod care poate fi folosit de mai multe ori va economisi timp la scrierea unei aplicații și, în timp, puteți chiar să creați o bibliotecă întreagă din aceste tipuri de module pe care le puteți utiliza în multe aplicatii. Cu ajutorul OOP, devine relativ mai ușor să scrieți un astfel de cod, deoarece structurile și funcțiile de date sunt încapsulate în un singur obiect, care poate fi folosit de orice număr de ori.

Câteva concepte de bază

Înainte de a începe să scrieți scripturi, trebuie să înțelegeți bine conceptele de clasă, obiect, variabilă de clasă și metodă.

Clasele

O clasă este un cadru pentru un obiect. Aceasta este o bucată de cod care definește:

  • Tipurile de date pe care le vor conține obiectele de clasă create
  • Funcții care vor conține aceste obiecte.

Când creați o aplicație OOP, de obicei veți crea mai multe clase care vor reprezenta diverse tipuri entitățile aplicației dvs. De exemplu, pentru a crea un forum, puteți crea clasele Forum, Topic, Post și Member.

Obiecte

Obiectul este o variabilă tip special, care este creat prin clasă. Conține date reale și funcții de manipulare. Puteți crea câte obiecte doriți dintr-o singură clasă. Fiecare funcție a unui obiect este independentă de alt obiect, chiar dacă sunt create din aceeași clasă.

Pentru comparație cu entități reale:

  • O clasă este cadrul pentru o mașină: definește cum va arăta și acționa mașina, dar este totuși o entitate abstractă
  • Un obiect este o mașină reală creată dintr-un cadru: are proprietăți reale (cum ar fi viteza) și comportament (cum ar fi accelerația sau frânarea).

Notă: Un obiect este adesea numit esența unei clase, iar procesul de creare a unui obiect al unei clase se numește implementare.

Variabile de clasă

Valorile datelor care sunt stocate într-un anumit obiect sunt scrise în variabile speciale numite variabile de clasă. Variabilele de clasă sunt strâns asociate cu obiectul său. Chiar dacă toate obiectele unei clase au aceleași variabile, valorile lor pot diferi.

Metode

Funcțiile definite într-o clasă și utilizate pe obiectele acelei clase sunt numite metode. Nu sunt foarte diferite de funcțiile obișnuite - le puteți transmite valori, pot conține variabile locale și pot returna valori. Cu toate acestea, metodele funcționează mai des cu variabile obiect. De exemplu, metoda login() pentru conectarea utilizatorilor pe forumul dvs. ar putea seta variabila de clasă loggedIn la true.

Cum se creează o clasă în PHP?

Acum că știți deja ce sunt clasele, metodele, variabilele de clasă și obiectele, este timpul să creați câteva clase și obiecte în cod PHP.

În primul rând, să vedem cum să creăm de fapt o clasă. Practic, scriptul pentru crearea unei clase arată astfel:

Class ClassName ( // (definiția clasei) )

De exemplu, dacă creați o clasă de membru pentru forumul dvs., ați scrie asta:

Membru al clasei ( // (definiția clasei) )

Este destul de simplu. Desigur, această clasă nu va face nimic până când nu adăugați variabile și metode la ea. Cu toate acestea, codul de mai sus creează o clasă PHP validă care poate fi utilizată.

Regula bunelor maniere: plasează fiecare clasă în dosar separat cu același nume cu numele clasei. De exemplu, puneți clasa Member în fișierul Member.php și stocați-o într-un folder, să zicem, clase.

Cum se creează obiecte în PHP?

Puteți crea un obiect folosind cuvântul cheie nou:

Nou ClassName()

Acest cod va crea un obiect din clasa ClassName. Va trebui să utilizați acest obiect mai târziu, așa că trebuie să îl stocați într-o variabilă. De exemplu, să creăm un obiect al clasei Member și să-l stocăm în variabila $member:

$member = membru nou();

De asemenea, putem crea un alt obiect din aceeași clasă:

$member2 = membru nou();

Chiar dacă am creat aceste două obiecte din aceeași clasă, variabilele $member și $member2 sunt independente una de cealaltă.

Creați variabile de clasă

Acum că știm deja cum să creăm clase și obiecte de clasă, să ne uităm la cum să creăm variabile de clasă. Există 3 accesorii pentru variabilele de clasă care pot fi adăugate la o clasă:

  • Variabile de clasă publică (publice): accesibile - i.e. pot fi citite și/sau modificate - oriunde în script, indiferent de locul în care se află acest cod - în interiorul clasei sau în afara acesteia
  • Variabile de clasă privată (private): accesibile numai metodelor de clasă. Cel mai bine este să faceți variabilele de clasă private pentru a separa obiectele de restul codului.
  • Variabile de clasă protejată: disponibile pentru metodele propriei clase, precum și pentru metodele claselor moștenite (vom vorbi mai târziu despre moștenire).

Pentru a crea o variabilă de clasă, scrieți cuvântul cheie public, private sau protected, apoi introduceți numele variabilei:

Clasa ClassName ( public $propertyName; privat $propertyName; protejat $propertyName; )

Să adăugăm o variabilă de clasă publică la clasa noastră Member pentru a stoca numele de utilizator:

Membru al clasei ( public $username = ""; )

Observați că am inițializat variabila noastră de clasă, valoarea acesteia este șirul gol, „”. Aceasta înseamnă că atunci când un utilizator nou este creat, numele de utilizator implicit va fi egal cu linie goală. La fel ca și în cazul variabilelor obișnuite în PHP, variabilele de clasă nu trebuie să fie inițializate, dar este mai bine să nu fii leneș. Dacă nu inițializați o variabilă de clasă, valoarea implicită a acesteia este nulă.

Accesarea variabilelor de clasă

Pentru a obține acces la o variabilă a unui obiect, utilizați operatorul ->:

$object->propertyName

Să încercăm. Să scriem un script care declară o clasă Membru și o variabilă de clasă, creează un obiect al acestei clase și apoi setează valoarea variabilei de clasă și o afișează pe ecran:

nume utilizator = "Fred"; echo $member->nume utilizator; // Tipăriți „Fred” ?>

Fugi acest cod, va afișa șirul „Fred”, valoarea variabilei de clasă $member->username. După cum puteți vedea, operați pe o variabilă obiect la fel ca o variabilă obișnuită - o puteți seta la o valoare și o puteți citi.

Adăugarea de metode la o clasă

Dar crearea de metode? După cum am menționat mai devreme, metodele sunt doar funcții obișnuite care fac parte dintr-o clasă. Deci, s-ar putea să nu fiți surprins că acestea sunt create folosind același cuvânt cheie pentru funcție. Singura diferență față de crearea de funcții obișnuite este că puteți adăuga și unul dintre identificatorii de acces (public, privat, protejat) la declarația acestuia. În acest fel, metodele sunt similare cu variabilele de clasă:

Clasa ClassName (funcție publică methodName() ( // (cod) ) funcție privată methodName() ( // (cod) ) funcție protejată methodName() ( // (cod) ) )

Notă: la fel ca și în cazul variabilelor de clasă, metodele publice pot fi apelate de oriunde, metodele private pot fi apelate doar în cadrul clasei, iar metodele protejate pot fi apelate din clasa însăși și descendenții acesteia.

Să încercăm să adăugăm câteva metode și variabile de clasă la clasa noastră:

  • variabilă privată de clasă $loggedIn pentru a identifica utilizatorul, de ex. indiferent dacă a intrat sau nu,
  • metoda login(), care se va autentifica în forum setând variabila de clasă $loggedIn la true,
  • metoda logout(), care se va deconecta din forum prin setarea variabilei clasei $loggedIn la false,
  • isLoggedIn(), care va returna valoarea variabilei clasei $loggedIn.

Iată codul nostru:

loggedIn = adevărat;

) funcția publică logout() ( $this->loggedIn = fals; ) public function isLoggedIn() ( returnează $this->loggedIn; ) ) ?>

Poate ați observat că am folosit un nou cuvânt cheie $this. În contextul metodelor unui obiect, variabila specială $this se referă la obiectul însuși. Folosind $this într-o metodă obiect, metoda poate accesa orice variabilă de clasă și metodă a obiectului.

Apropo, variabila noastră de clasă este privată, deci nu poate fi apelată din nicio parte a scriptului, ci doar din metodele login(), logout() și isLoggedIn(). Aceasta este o abordare bună, deoarece elementele interne ale obiectului (cum ar fi modul în care înregistrează exact dacă utilizatorul este conectat sau nu) este separat de restul codului. Ori de câte ori este posibil, încercați să utilizați variabile de clasă privată, astfel încât obiectele dvs. să fie autonome, mobile și protejate.

Notă: variabila clasa $username din exemplul nostru este publică. Am făcut asta doar pentru a demonstra cum puteți accesa variabilele clasei unui obiect. În proiectele reale, preferați să faceți această variabilă privată și să creați variabile speciale de clasă publică pentru a seta valorile numelui de utilizator, dacă este necesar.

Utilizarea Metodelor

Pentru a apela o metodă pe un obiect, utilizați operatorul ->, cu care v-ați familiarizat deja.

$object->methodName()

Acest lucru funcționează la fel ca apelarea unei funcții obișnuite. Puteți trece argumente între paranteze (presupunând că este nevoie de orice argument, desigur), apelul la metodă poate returna și anumite valori, pe care apoi îl puteți folosi.

loggedIn = adevărat;
) funcția publică logout() ( $this->loggedIn = false; ) public function isLoggedIn() ( return $this->loggedIn; ) ) $member = new Member(); $member->username = "Fred"; echo $member->nume utilizator . „este”. ($membru->
"; $member->login(); echo $member->nume utilizator . " este " . ($member->isLoggedIn() ? "conectat": "deconectat") ."
"; ?>

"; $member->logout(); echo $member->nume utilizator . " este " . ($member->isLoggedIn() ? "conectat": "deconectat") ."

Acest script va afișa următoarele:

Fred este deconectat Fred este conectat Fred este deconectat

  1. Iată cum funcționează:
  2. După ce am descris clasa Member, am creat obiectul acesteia și l-am stocat în variabila $member. De asemenea, am dat variabilei de clasă $username a acestui obiect valoarea „Fred”.
  3. Apoi am apelat metoda $member->isLoggedIn() pentru a determina dacă utilizatorul este conectat sau nu. Această metodă returnează pur și simplu valoarea variabilei clasei $loggedIn. Deoarece valoarea implicită a acestei variabile de clasă este falsă, rezultatul apelării $member->isLoggedIn() va fi fals, așa că va fi afișat mesajul „Fred este deconectat”.
  4. Apoi numim metoda login(). Acesta va seta variabila de clasă $loggedIn la adevărat.
  5. Să apelăm metoda logout(), care setează valoarea proprietății $loggedIn la false.
  6. Să apelăm metoda $member->isLoggedIn() a treia oară. Acum va returna false deoarece proprietatea $loggedIn este setată din nou la false. Deci, mesajul „Fred este deconectat” va fi afișat din nou.

Notă: în cazul în care ați văzut asta mai întâi: ?: este un operator ternar. Aceasta este o versiune simplificată a blocurilor if...else. Puteți afla despre aceste tipuri de operatori.

Concluzii

În acest tutorial ați învățat elementele de bază ale OOP în PHP. Ați învățat despre lucruri precum:

  • Ce este OOP și de ce este util?
  • concepte de clase, obiecte, variabile de clasă și metode
  • cum se creează clase și obiecte
  • cum să creați și să utilizați variabile de clasă
  • concepte de identificatori de acces public, privat, protejat
  • cum să creați și să utilizați metodele de clasă

Ați învățat deja multe și veți învăța mult mai multe în următoarele lecții. Cu toate acestea, dacă ați analizat toate exemplele pe care le-am dat, aveți o bază solidă. Puteți începe să creați aplicații folosind OOP.

16 aprilie 2008 la 12:15

PHP - OOP sau abordare procedurală

  • PHP

PHP este unul dintre cele mai populare limbaje de programare de scripting. Aproape 60% dintre serverele web folosesc PHP Milioane de site-uri web și aplicații web sunt dezvoltate în PHP în fiecare lună.

PHP a fost dezvoltat inițial ca un simplu înlocuitor pentru Perl, iar în câțiva ani a devenit extrem de puternic și popular. Limbajul PHP în sine este foarte asemănător cu ANSI C.
Unul dintre motivele pentru care PHP a devenit atât de popular este curba sa scurtă de învățare.

Învățarea PHP nu este deloc dificilă, mai ales dacă ești familiarizat cu sintaxa Java sau C.

Deoarece scrierea scripturilor PHP este destul de ușoară, oricine poate scrie cod PHP fără a respecta nicio convenție și a amesteca stratul de prezentare cu logica de afaceri (acesta este unul dintre motivele principale pentru care există atât de multe proiecte negestionate). Deoarece PHP nu are neapărat convenții stricte de codificare, de-a lungul anilor, pe măsură ce proiectul devine din ce în ce mai mare, devine o aplicație imensă, de negestionat.

OOP sau programarea orientată pe obiecte este bine folosită în practica de programare pentru a crea proiecte mai ușor de gestionat.
Abordarea procedurală implică scrierea codului programului fără a utiliza obiecte. Programarea procedurală presupune scrierea codului cu sau fără rutine.

OOP antrenează orice limbaj de programare pentru a produce cod mai bun și este folosit pentru a obține o productivitate mai mare și pentru a scrie proiecte mai mari fără teama de a fi confuz în gestionarea acestora. OOP vă oferă posibilitatea de a crea obiecte reutilizabile, astfel încât dvs. sau alți dezvoltatori să le puteți utiliza în proiectele lor fără a le reproiecta iar și iar. OOP elimină barierele și complexitatea în scrierea și gestionarea aplicațiilor mari.

PHP ne permite să scriem aplicații în 2 moduri diferite, primul este procedural și al doilea este orientat obiect. Dacă încă nu înțelegeți diferența dintre aceste două abordări, să ne uităm la aceste bucăți de cod - același exemplu scris în abordări diferite.

Procedural:

$user_input = $_POST[‘câmp’];
$conținut_filtrat = filtru ($intrare_utilizator); //filtrarea intrărilor utilizatorului
mysql_connect("dbhost", "dbuser", "dbpassword"); //baza de date
mysql_select_db("nume db");
$sql = „o interogare”;
$rezultat = mysql_query($sql);
while ($date = mysql_fetch_assoc())
{
proces($date);
}
process_user_input($conținut_filtrat);

Și iată aceeași bucată de cod folosind OOP:

$input_filter = filtru nou();
$input_filter->filter_user_input(); //se filtrează intrările utilizatorului
$db = new dal("mysql"); //stratul de acces la date
$db->connect($dbconfig);//folosim mysql
$rezultat = $db->execute($sql);
ReportGenerator::makereport($rezultat); //procesează datele
$model = new Postmodel($filtru->get_filtered_content());
$model->inserare();

Dacă te uiți îndeaproape la aceste 2 bucăți de cod, vei observa că codul care utilizează OOP este mai ușor de citit și mai ușor de înțeles.

Codul cu OOP este mai bine organizat deoarece este clar cu ce obiect este procesat. Aplicațiile mari scrise folosind o abordare procedurală devin aproape imposibil de perceput după ce au fost lansate mai multe versiuni. Desigur, puteți urma reguli stricte pentru scrierea codului programului, dar acestea sunt aprobate de milioane de dezvoltatori care știu că acest lucru nu vă va oferi în cele din urmă controlabilitatea și capacitatea de utilizare a proiectului dacă nu utilizați OOP în programul dvs.
Aproape toate aplicațiile mari sunt scrise utilizând orientat obiect
abordare.

Pe baza celor de mai sus, putem extrage avantajele utilizării OOP:

OOP a fost creat pentru a face viața mai ușoară dezvoltatorilor. Folosind POO vă puteți descompune problemele mari în probleme mici, care sunt mult mai ușor de rezolvat.
Principala cerință a OOP: faceți tot ce doriți ca obiecte. Obiectele sunt bucăți mici de cod separate care pot combina date și proprietăți împreună. În aplicații, toate obiectele interacționează între ele.

OOP poate fi considerat mai bine din unghiuri diferite, mai ales atunci când timpul de dezvoltare și dezvoltarea ulterioară a aplicației sunt importante pentru dvs.
Principalele avantaje ale utilizării OOP pot fi exprimate astfel:

* Reutilizați: Un obiect este un obiect logic care are un set de proprietăți și metode și poate interacționa cu alte obiecte. Un obiect poate fi complet independent sau poate depinde de alte obiecte. Un obiect este de obicei creat pentru a rezolva probleme specifice. Prin urmare, atunci când alți dezvoltatori întâmpină probleme similare, ei vă pot conecta clasa la proiectul lor și o pot folosi fără teama că nu le va întrerupe procesul de dezvoltare. Acest lucru evită DRY, care înseamnă Don’t Repeat Yourself. În programarea procedurală sau modulară, reutilizarea este posibilă numai în agregat.

* Refactorizarea: Când trebuie să utilizați refactorizarea într-un proiect, OOP vă oferă avantaje maxime, deoarece toate obiectele sunt elemente mici și își conțin proprietățile și metodele ca parte a lor. Acest lucru face ca refactorizarea să fie relativ ușor de utilizat.

* Extensibilitate: Dacă aveți nevoie să extindeți funcționalitatea proiectului dvs., puteți obține rezultate mai bune folosind OOP. Una dintre principalele funcționalități ale OOP este extensibilitatea. Puteți utiliza refactorizarea obiectelor pentru a adăuga funcționalitate. Lucrând la acest lucru, puteți salva în continuare
compatibilitatea anterioară a obiectului - prin urmare, puteți lucra bine cu vechiul cod. Sau puteți extinde obiectul și crea unul complet nou, care va conține toate proprietățile și metodele necesare ale obiectului părinte din care este derivat noul și apoi adăugați noi funcții. Aceasta se numește „moștenire” și este o caracteristică foarte importantă a OOP.

* Sprijin: codul orientat pe obiecte este mai ușor de întreținut deoarece
urmează convenții de codare foarte stricte și este scrisă într-o manieră auto-explicativă.
De exemplu, atunci când un dezvoltator adaugă, reprelucrează sau depanează cod, el poate găsi cu ușurință structura internă a codului și poate menține codul din când în când. În plus, atunci când aveți o echipă de dezvoltatori care lucrează în mediul dvs., OOP poate fi o soluție mai bună, deoarece vă puteți distribui codul între membrii echipei după ce îl descompuneți în părți mici. Aceste părți mici pot fi dezvoltate ca obiecte separate, astfel încât dezvoltatorii pot lucra aproape independent unul de celălalt. În cele din urmă, combinarea tuturor pieselor într-o singură aplicație nu va fi dificilă.

* Eficienţă: Ideea de OOP a fost de fapt dezvoltată pentru a crește eficiența și a ușura procesul de dezvoltare. Sunt dezvoltate mai multe modele de design pentru a crea un cod mai eficient și mai bun.
Mai mult, în POO poți reflecta asupra deciziilor tale într-un mod mai convenabil decât într-o abordare procedurală. Pentru că vă împărțiți problema în mai multe probleme mici și găsiți o soluție pentru fiecare dintre ele separat, marea problemă se rezolvă de la sine.

P.S. primul meu habratopic, dacă vă place, voi traduce cartea în continuare, pentru mine este destul de interesant și informativ

11 martie 2010 la ora 11:37

OOP cu exemple (partea 1)

  • Procesul educațional în IT

Prin voința sorții, trebuie să citesc un curs special despre modele de design la o universitate. Cursul special este obligatoriu, prin urmare, studenții care vin la mine sunt foarte diferiți. Desigur, printre ei sunt și programatori practicanți. Dar, din păcate, majoritatea oamenilor au dificultăți în înțelegerea termenilor de bază ai POO.

Pentru a face acest lucru, am încercat să explic conceptele de bază ale POO (clasă, obiect, interfață, abstractizare, încapsulare, moștenire și polimorfism) folosind exemple mai mult sau mai puțin vii.

Prima parte de mai jos este despre clase, obiecte și interfețe.
ilustrează încapsularea, polimorfismul și moștenirea

Concepte de bază ale POO

Clasă
Imaginați-vă că proiectați o mașină. Știi că o mașină trebuie să conțină motor, suspensie, două faruri, 4 roți etc. De asemenea, știi că mașina ta trebuie să fie capabilă să accelereze și să încetinească, să vireze și să poată reveni. Și, cel mai important, știi exact cum interacționează motorul și roțile, în funcție de ce legi se mișcă arborele cu came și arborele cotit, precum și cum sunt proiectate diferențialele. Sunteți încrezător în cunoștințele dvs. și începeți să proiectați.

Descrieți toate piesele care compun mașina dvs., precum și modul în care aceste părți interacționează între ele. În plus, descrieți ce trebuie să facă utilizatorul pentru a face frâna mașinii sau a aprinde farurile pentru faza lungă. Rezultatul muncii tale va fi o schiță. Tocmai ați dezvoltat ceea ce se numește în OOP Clasă.

Clasă este un mod de a descrie o entitate care definește o stare și un comportament care depinde de această stare, precum și reguli de interacțiune cu această entitate (contract).

Din punct de vedere al programării, o clasă poate fi considerată ca un set de date (câmpuri, atribute, membri ai clasei) și funcții de lucru cu acestea (metode).

Din punct de vedere al structurii programului, o clasă este un tip de date complex.

În cazul nostru, clasa va afișa o entitate - o mașină. Atributele clasei vor fi motorul, suspensia, caroseria, patru roți etc. Metodele de clasă vor fi „deschideți ușa”, „apăsați pedala de accelerație” și, de asemenea, „pompați o porțiune de benzină din rezervorul de benzină în motor”. Primele două metode sunt disponibile pentru execuție de către alte clase (în special, clasa „Driver”). Acesta din urmă descrie interacțiunile din cadrul clasei și nu este accesibil utilizatorului.

De acum înainte, deși cuvântul „utilizator” este asociat cu Solitaire și Microsoft Word, ne vom referi la programatorii care folosesc clasa ta ca utilizatori, inclusiv la tine. Vom numi persoana care este autorul clasei dezvoltator.

Obiect
Ai făcut o treabă grozavă, iar mașinile dezvoltate conform desenelor tale ies de pe linia de asamblare. Iată-i, stând în rânduri îngrijite în curtea fabricii. Fiecare dintre ele îți repetă exact desenele. Toate sistemele interacționează exact așa cum ați proiectat. Dar fiecare mașină este unică. Toate au numere de caroserie și de motor, dar aceste numere sunt toate diferite, mașinile diferă ca culoare, iar unele chiar au piese turnate în loc de roți ștanțate. Aceste mașini sunt în esență obiecte din clasa ta.

Obiect (instanță) este un reprezentant individual al unei clase care are o stare și un comportament specific care sunt în întregime determinate de clasă.

În termeni simpli, un obiect are valori specifice de atribut și metode care operează pe acele valori bazate pe regulile definite în clasă. În acest exemplu, dacă clasa este o mașină abstractă din „lumea ideilor”, atunci obiectul este o mașină de beton care stă sub geamurile tale.

Interfață
Când ne apropiem de un aparat de cafea sau ne urcăm la volan, începem o interacțiune cu ei. De obicei, interacțiunea are loc folosind un anumit set de elemente: un slot pentru acceptarea monedelor, un buton pentru selectarea unei băuturi și un compartiment pentru distribuirea unui pahar într-o mașină de cafea; volan, pedale, schimbător de viteze într-o mașină. Există întotdeauna un set limitat de comenzi cu care putem interacționa.

Interfață este un set de metode de clasă care sunt disponibile pentru utilizare de către alte clase.

Evident, interfața unei clase va fi un set de toate metodele sale publice împreună cu un set de atribute publice. În esență, o interfață specifică o clasă, definind clar toate acțiunile posibile asupra acesteia.
Un bun exemplu de interfață este tabloul de bord al unei mașini, care vă permite să apelați metode precum accelerarea, frânarea, virajul, schimbarea vitezelor, aprinderea farurilor etc. Adică toate acțiunile pe care o altă clasă (în cazul nostru, șoferul) le poate efectua atunci când interacționează cu mașina.

Când descrieți o interfață de clasă, este foarte important să găsiți un echilibru între flexibilitate și simplitate. O clasă cu o interfață simplă va fi ușor de utilizat, dar vor exista probleme pe care nu le poate rezolva. În același timp, dacă interfața este flexibilă, atunci cel mai probabil va consta din metode destul de complexe, cu un număr mare de parametri care vă vor permite să faceți multe, dar utilizarea acesteia va fi plină de mari dificultăți și riscul de a face o greșeală, ceva amestecat

Un exemplu de interfață simplă ar fi o mașină cu transmisie automată. Orice blondă care a absolvit un curs de conducere de două săptămâni va putea să-și stăpânească funcționarea foarte repede. Pe de altă parte, pentru a stăpâni controlul unei aeronave moderne de pasageri, ai nevoie de câteva luni, sau chiar ani de antrenament intens. Nu mi-aș dori să fiu la bordul unui Boeing pilotat de cineva care are două săptămâni de experiență în zbor. Pe de altă parte, nu vei primi niciodată o mașină care să decoleze și să zboare de la Moscova la Washington.