PHP - OOP alebo procedurálny prístup. Objektovo orientované programovanie (OOP PHP)

  • 18.06.2019

Pravdepodobne v polovici voľných pracovných miest (ak nie viac) je potrebná znalosť a porozumenie OOP. Áno, táto metodika určite uchvátila nejedného programátora! Pochopenie OOP zvyčajne prichádza so skúsenosťami, pretože na túto tému prakticky neexistujú žiadne vhodné a dostupné materiály. A ak aj áno, zďaleka nie je pravda, že čitatelia na ne narazia. Dúfam, že sa mi podarí vysvetliť princípy tejto nádhernej metodiky, ako sa hovorí, na prstoch.

Takže už na začiatku článku som už spomenul pojem „metodika“. Vo vzťahu k programovaniu tento pojem znamená existenciu akéhokoľvek súboru spôsobov, ako organizovať kód, metódy jeho písania, po ktorých bude programátor schopný písať celkom vhodné programy.

OOP (alebo objektovo orientované programovanie) je spôsob organizácie programového kódu, kedy hlavnými stavebnými kameňmi programu sú objekty a triedy a logika programu je postavená na ich interakcii.


O objektoch a triedach

Trieda- to je taká dátová štruktúra, ktorú si môže vytvoriť sám programátor. V podmienkach OOP sa trieda skladá z poliach(jednoduchým spôsobom - premenné) a metódy(jednoduchým spôsobom - funkcie). A ako sa ukázalo, kombinácia údajov a funkcií práce s nimi v jednej štruktúre dáva nepredstaviteľnú silu. Objekt je konkrétna inštancia triedy. V súlade s analógiou triedy s dátovou štruktúrou je objekt konkrétna dátová štruktúra, ktorej polia majú priradené nejaké hodnoty. Vysvetlím to na príklade:

Povedzme, že musíme napísať program, ktorý vypočíta obvod a plochu trojuholníka s dvomi stranami a uhlom medzi nimi. Na napísanie takéhoto programu pomocou OOP budeme musieť vytvoriť triedu (teda štruktúru) Triangle. Trieda Triangle uloží tri polia (tri premenné): strana A, strana B, uhol medzi nimi; a dve metódy (dve funkcie): výpočet obvodu, výpočet plochy. Pomocou tejto triedy môžeme opísať akýkoľvek trojuholník a vypočítať jeho obvod a plochu. Takže konkrétny trojuholník so špecifickými stranami a uhlom medzi nimi sa bude nazývať inštanciou triedy Triangle. Trieda je teda šablóna a inštancia je konkrétna implementácia šablóny. Ale už inštancie sú objekty, teda špecifické prvky, ktoré uchovávajú konkrétne hodnoty.

Java je jedným z najpoužívanejších objektovo orientovaných programovacích jazykov. Bez použitia predmetov to jednoducho nejde. Takto by vyzeral kód triedy popisujúcej trojuholník v tomto jazyku:

/** * Trieda Triangle. */ class Triangle ( /** * Špeciálna metóda nazývaná konštruktor triedy. * Vstupné sú tri parametre: * dĺžka strany A, dĺžka strany B, * uhol medzi týmito stranami (v stupňoch) */ Triangle(double sideA, double sideB , double angleAB) ( this.sideA = sideA; this.sideB = sideB; this.angleAB = angleAB; ) double sideA; //Pole triedy, ukladá hodnotu strany A do popísaného trojuholníka double stranaB; //Pole triedy, ukladá hodnotu strany B v opísanom trojuholníku double angleAB; //Pole triedy, ktoré ukladá uhol (v stupňoch) medzi dvoma stranami v opísanom trojuholníku /** * Metóda triedy, ktorá vypočítava plochu ​trojuholník */ double getSquare() ( double square = this.sideA * this .sideB * Math.sin(this.uholAB * Math.PI / 180); return square; ) /** * Metóda triedy, ktorá vypočítava obvod trojuholníka */ double getPerimeter() ( double sideC = Math.sqrt(Math.pow (this.sideA, 2) + Math.pow(this.sideB, 2) - 2 * this.sideA * this.sideB * Math .cos(thi s.uholAB * Math.PI / 180)); dvojitý obvod = táto.stranaA + táto.stranaB + stranaC; návratový obvod; ))

Ak do triedy pridáme nasledujúci kód:

/** * Tu začína program */ public static void main(String args) ( //Hodnoty ​​5, 17, 35 idú do konštruktora triedy Triangle Triangle trojuholník1 = new Triangle(5, 17, 35); System.out .println("Oblasť trojuholníka1: "+trojuholník1.getSquare()); System.out.println("Obvod trojuholníka1: "+trojuholník1.getPerimeter()); //Hodnoty 6, 8, 60 prejdite na konštruktor triedy Triangle Triangle trojuholník2 = new Triangle(6, 8, 60); System.out.println("Oblasť trojuholníka1: "+trojuholník2.getSquare()); System.out. println("Obvod trojuholníka1: "+trojuholník2.getPerimeter()); )

potom už môže byť program spustený na vykonanie. Toto je vlastnosť jazyka Java. Ak má trieda takúto metódu

public static void main (string args)

potom môže byť táto trieda vykonaná. Poďme analyzovať kód podrobnejšie. Začnime s čiarou

Trojuholnik trojuholnik1 = new Triangle(5, 17, 35);

Tu vytvoríme inštanciu trojuholníka1 triedy Triangle a hneď mu dáme parametre strán a uhol medzi nimi. Zároveň sa zavolá špeciálna metóda nazývaná konštruktor a vyplní polia objektu hodnotami odovzdanými konštruktorovi. No, linky

System.out.println("Oblasť trojuholníka1: "+trojuholník1.getSquare()); System.out.println("Obvod trojuholníka1: "+trojuholník1.getPerimeter());

výstup vypočítanej plochy trojuholníka a jeho obvodu na konzolu.

Podobne sa všetko deje pre druhú inštanciu triedy Triangle.

Pochopenie podstaty tried a konštrukcie konkrétnych objektov je istým prvým krokom k pochopeniu metodiky OOP.

Ešte raz to najdôležitejšie:

OOP je spôsob organizácie programového kódu;

Trieda- ide o vlastnú dátovú štruktúru, ktorá kombinuje dáta a funkcie na prácu s nimi (polia tried a metódy tried);

Objekt je špecifická inštancia triedy, ktorej polia sú nastavené na konkrétne hodnoty.


Tri magické slová

OOP zahŕňa tri kľúčové prístupy: dedičnosť, zapuzdrenie a polymorfizmus. Najprv tu sú definície z wikipédie:

Zapuzdrenie je vlastnosť systému, ktorá vám umožňuje kombinovať údaje a metódy, ktoré s nimi pracujú v triede. Niektoré jazyky (napríklad C++) prirovnávajú zapuzdrenie so skrývaním, ale väčšina (Smalltalk, Eiffel, OCaml) tieto pojmy rozlišuje.

Dedičnosť je systémová vlastnosť, ktorá vám umožňuje opísať novú triedu založenú na existujúcej s čiastočne alebo úplne vypožičanou funkcionalitou. Trieda, z ktorej dedíte, sa nazýva základná, nadradená alebo nadradená trieda. Nová trieda je potomkom, nasledovníkom, potomkom alebo odvodenou triedou.

Polymorfizmus je vlastnosť systému, ktorá umožňuje používať objekty s rovnakým rozhraním bez informácií o type a vnútornej štruktúre objektu.

Je dosť ťažké pochopiť, čo všetky tieto definície v praxi znamenajú. V špecializovaných knihách, ktoré sa venujú tejto téme, má každá definícia často celú kapitolu, ale aspoň odsek. Aj keď je veľmi málo podstaty toho, čo je potrebné pochopiť a navždy vtlačiť do mozgu vášho programátora.
A čísla v lietadle budú slúžiť ako príklad na analýzu. Zo školskej geometrie vieme, že pre všetky obrazce opísané na rovine je možné vypočítať obvod a plochu. Napríklad pre bod sú oba parametre nulové. Pre segment môžeme vypočítať iba obvod. A pre štvorec, obdĺžnik alebo trojuholník - oboje. Teraz popíšeme tento problém z hľadiska OOP. Je tiež užitočné zachytiť reťaz zdôvodňovania, ktorá vedie k hierarchii tried, ktorá je zase stelesnená v pracovnom kóde. Choď:


Bod je teda najmenší geometrický útvar, ktorý je základom všetkých ostatných konštrukcií (obrázkov). Preto je bod vybraný ako základná rodičovská trieda. Napíšme bodovú triedu v jazyku Java:

/** * Bodová trieda. Základná trieda */ class Point ( /** * Prázdny konštruktor */ Point() () /** * Metóda triedy, ktorá vypočítava plochu obrázku */ double getSquare() ( return 0; ) /** * Metóda triedy, ktorá vypočítava obvod obrázku */ double getPerimeter() ( návrat 0; ) /** * Metóda triedy, ktorá vráti popis obrázku */ String getDescription() ( return "Point"; ) )

Výsledná trieda Point má prázdny konštruktor, pretože v tomto príklade pracujeme bez konkrétnych súradníc a pracujeme iba s parametrami, hodnotami strán. Keďže bod nemá žiadne strany, netreba mu odovzdávať žiadne parametre. Všimnite si tiež, že trieda má metódy Point::getSquare() a Point::getPerimeter() na výpočet plochy a obvodu, obe vracajú 0. Pre bod je to logické.


Keďže náš bod je základom všetkých ostatných figúrok, zdedíme triedy týchto ostatných figúrok z triedy Bod. Opíšme triedu segmentu zdedenú z triedy bodov:

/** * Trieda segmentu */ trieda LineSegment predlžuje bod ( LineSegment(double segmentLength) ( this.segmentLength = segmentLength; ) double segmentLength; // Dĺžka segmentu /** * Metóda prepísanej triedy, ktorá vypočítava oblasť segmentu */ double getSquare( ) ( return 0; ) /** * Prepísaná metóda triedy, ktorá počíta obvod segmentu */ double getPerimeter() ( return this.segmentLength; ) String getDescription() ( return "Dĺžka segmentu: " + this.segmentLength; ) )

Trieda LineSegment rozširuje Point

znamená, že trieda LineSegment dedí z triedy Point. Metódy LineSegment::getSquare() a LineSegment::getPerimeter() prepisujú zodpovedajúce metódy základnej triedy. Plocha segmentu sa vždy rovná nule a plocha obvodu sa rovná dĺžke tohto segmentu.

Teraz, podobne ako trieda segmentov, popíšme triedu trojuholníka (ktorá tiež dedí z triedy bodov):

/** * Trieda Triangle. */ class Triangle extends Point ( /** * Class Constructor. Ako vstup berie tri parametre: * dĺžka strany A, dĺžka strany B, * uhol medzi týmito stranami (v stupňoch) */ Triangle(double sideA, double sideB) , dvojitý uholAB ) ( táto.stranaA = stranaA; táto.stranaB = stranaB; tento.uholAB = uholAB; ) dvojitá stranaA; //Pole triedy, uloží hodnotu strany A do opísanej dvojitej strany trojuholníkaB; //Pole triedy, ukladá hodnotu strany B v popísanom trojuholníku trojuholník double angleAB; //Pole triedy, ktoré ukladá uhol (v stupňoch) medzi dvoma stranami v popísanom trojuholníku /** * Metóda triedy, ktorá vypočítava obsah trojuholníka */ double getSquare() ( double square = (this.sideA * this.sideB * Math.sin(this.uholAB * Math.PI / 180)))/2; return square; ) /** * Metóda triedy, ktorá vypočítava obvod trojuholník */ double getPerimeter() ( double sideC = Math.sqrt(Math. pow(this.sideA, 2) + Math.pow(this.sideB, 2) - 2 * this.sideA * this.sideB * Math. cos(tento.uholAB * Mat h.PI/180)); dvojitý obvod = táto.stranaA + táto.stranaB + stranaC; návratový obvod; ) String getDescription() ( return "Trojuholnik so stranami: " + tato.stranaA + ", " + tato.stranaB + " a uhol medzi nimi: " + tento.uholAB; ) )

Nie je tu nič nové. Metódy Triangle::getSquare() a Triangle::getPerimeter() tiež prepíšu zodpovedajúce metódy základnej triedy.
No a teraz v skutočnosti samotný kód, ktorý ukazuje kúzlo polymorfizmu a odhaľuje silu OOP:

Class Main ( /** * Tu začína program */ public static void main(String args) ( //ArrayList je špeciálna dátová štruktúra v jazyku Java, ktorá // umožňuje ukladať objekty špecifického typu do poľa. ArrayList Figures = new ArrayList (); //pridajte tri rôzne objekty k obrazcom array Figures.add(new Point()); Figures.add(new LineSegment(133)); Figure.add(new Triangle(10, 17, 55)); pre (int i = 0; i

Vytvorili sme pole objektov triedy Point a keďže triedy LineSegment a Triangle sú zdedené z triedy Point, môžeme ich vložiť aj do tohto poľa. Ukazuje sa, že každý obrazec, ktorý sa nachádza v poli obrazcov, môžeme považovať za objekt triedy Point. O tom je polymorfizmus: nie je známe, do akej triedy patria objekty v poli obrázky, ale keďže všetky objekty v tomto poli patria do rovnakej základnej triedy Point, potom sa použijú aj všetky metódy, ktoré sa vzťahujú na triedu Point. k triedam jeho potomkov.


Teraz o zapuzdrení. Skutočnosť, že sme umiestnili parametre obrazca a metódy na výpočet plochy a obvodu do jednej triedy, je to, čo je zapuzdrenie, zapuzdreli sme obrazce do samostatných tried. To, že na výpočet obvodu používame v triede špeciálnu metódu je zapuzdrenie, výpočet obvodu sme zapuzdreli v metóde getPerimiter(). Inými slovami, zapuzdrenie je skrytie implementácie (možno najkratšia a zároveň priestranná definícia zapuzdrenia).


Celý príklad kódu:

Importovať java.util.ArrayList; class Main ( /** * Tu začína program */ public static void main(String args) ( //ArrayList je špeciálna dátová štruktúra v jazyku Java, ktorá // umožňuje ukladať objekty špecifického typu do poľa. ArrayList Figures = new ArrayList (); //pridajte tri rôzne objekty k číslam array numbers.add(new Point()); Figures.add(new LineSegment(133)); Figure.add(new Triangle(10, 17, 55)); pre (int i = 0; i

Pokryjeme pojmy ako objektovo orientované programovanie, triedy PHP, konštruktory PHP, deštruktory PHP, magické metódy PHP atď. Táto príručka je určená pre začiatočníkov a skúsených programátorov, ktorí sa chcú naučiť PHP OOP od základnej úrovne.

Jednou z najvýznamnejších zmien v PHP 5 je zavedenie plne objektového modelu, ktorý zlepšuje výkon. Niektoré z dôležitých nových funkcií pridaných do PHP 5 sú konečné a abstraktné metódy, triedy, rozhrania, klonovanie a magické metódy. V tomto návode na OOP PHP sa pozrieme na príklady použitia každého z nich.

V objektovo orientovanom programovaní sa s objektom zaobchádza rovnakým spôsobom ako s referenciami alebo ukazovateľmi. To znamená, že každá nová premenná obsahuje odkaz na objekt, nie kópiu celého objektu.

Najťažšie pochopiteľný koncept sú základy OOP, keďže sa líšia od bežného programovania v PHP. Keď však pochopíte základné princípy, samotný model sa pre vás stane jednoduchým a zrozumiteľným.

Čo je OOP v PHP?

Keďže pojem objektovo orientované programovanie začína slovom „objekt“, môžeme povedať, že ide o špeciálny typ programovania, v ktorom sa vytvárajú a používajú objekty.

Tu je vysvetlenie PHP OOP pre figuríny. Pozrite sa na svet okolo nás, je plný predmetov. Slnko, mesiac, autá, stromy, domy atď. atď. Toto všetko sú predmety, majú atribúty a funkcie. V procese myslenia operujeme s predmetmi. Keď hovoríme o aute, nemyslíte na kolesá, motor, sedadlá, dvere, myslíte na auto ako na vec, ktorou je. Jednoducho povedané, premýšľate v pojmoch subjektu alebo objektu. Objektová orientácia je reprezentácia pri programovaní prvkov ako objektov.

Auto je objekt. Má atribúty farby, veľkosti, hmotnosti a funkcie pohybu. Akýkoľvek objekt bez funkčnosti bude zbytočný. V OOP programátor používa objekty; každý objekt má nejaké atribúty a funkcie. Vo všeobecnosti programovanie spočíva v vytváraní modulov pomocou objektov.

Jednoduchá definícia objektovo orientovaného programovania:

Objektovo orientované programovanie je programovanie založené na objektoch, ktoré obsahujú dáta (atribúty) a metódy (funkčné), ktoré tieto dáta spracúvajú. Objekty sú dátovým typom definovaným programátorom a programátorom definované sú aj interakcie medzi rôznymi objektmi.

Inými slovami, OOP umožňuje programátorovi zoskupiť podobné úlohy do tried, pričom trieda môže obsahovať dáta a funkcie na prístup k týmto dátam, ktoré spolu súvisia.

Základy OOP v PHP vám pomôžu vyvinúť kód, ktorý sa ľahšie udržiava a spravuje. Čím je kód čistejší a čitateľnejší, tým je pravdepodobnejšie, že bude znovu použitý. Výsledkom je, že dizajnové vzory môžu byť aplikované na systém. V OOP sa moduly vytvárajú a používajú podľa požiadaviek. Pomocou objektovo orientovaného programovania v PHP môžeme vytvárať aplikácie pre stránky, ktoré majú modulárnu štruktúru.

Dôležité pojmy v príručke PHP OOP:

Nasleduje všeobecná definícia niektorých dôležitých pojmov, ktoré sa často používajú v objektovo orientovanom PHP.

Trieda

V OOP PHP je trieda dátový typ definovaný programátorom. Trieda obsahuje dáta a funkcie na prácu s týmito dátami. Údaje a funkcie majú súkromný prístupový identifikátor. To znamená, že nie sú viditeľní mimo triedy. Trieda je šablóna alebo šablóna, z ktorej môžete vytvoriť toľko kópií alebo inštancií, koľko potrebujete.

Objekt

Objekt je známy aj ako inštancia. Keď je nastavená inštancia triedy, vytvorí sa objekt. Ak je trieda vzor, ​​potom objekt je hotový produkt vytvorený zo vzoru. Po definovaní triedy je možné z nej vytvoriť mnoho objektov.

členská premenná

Premenné definované v triede sa nazývajú členské premenné. Toto sú vlastne údaje obsiahnuté v tejto triede, môžu byť upravené iba funkciami tejto triedy. Členské premenné sú zvyčajne viditeľné iba pre danú triedu a sú skryté pred ostatnými triedami.

členská funkcia

Funkcie definované v triede sa nazývajú členské funkcie. Nie sú viditeľné ani pre iné triedy. Používajú sa na zmenu členských premenných, na prístup k údajom objektu.

Konštruktér

Konštruktor je špeciálny typ členskej funkcie. Keď je nastavená trieda, vytvorí sa objekt, táto funkcia sa zavolá automaticky a priradí počiatočné hodnoty premenným triedy.

Deštruktor

Ide o špeciálny typ funkcie, ktorá sa volá automaticky pri odstránení objektu.

Dedičnosť

V PHP 5 je dedičnosť OOP proces, ktorým trieda (podtrieda) získa všetky atribúty a funkcie inej triedy (nadtriedy).

Super trieda

Tiež známa ako základná alebo rodičovská trieda, je dedená jednou alebo viacerými podtriedami.

Podtrieda

Podtrieda alebo odvodená trieda, podtrieda dedí z nadtriedy.

Polymorfizmus

Toto je fenomén v OOP, kde jedna funkcia môže byť použitá na rôzne účely.

Zapuzdrenie

Jeden z najdôležitejších konceptov objektovo orientovaného programovania. Údaje a funkcie, ktoré s týmito údajmi pracujú, sú vzájomne prepojené a nie sú viditeľné pre iné funkcie.

Abstrakcia

Abstrakcia znamená, že detaily implementácie funkcií alebo tried nie sú viditeľné.

, čo znamená, že funkcie, ktoré majú rovnaký názov, ale odlišný počet argumentov, fungujú odlišne.

Triedy a predmety:

Trieda a objekt sú široko používané ako synonymické pojmy v objektovo orientovanom programovaní, ale zásadne sa navzájom veľmi líšia. Trieda je šablóna, vzor alebo forma a objekt je produkt alebo časť odliata z tejto konkrétnej šablóny alebo formy.

Vezmite si napríklad dom. Trieda je základom domova; má rozmery, tvar, počet dverí, priechodov atď. Ale toto je len projekt, nie samotný dom. Keď je fyzický dom postavený na základe informácií obsiahnutých v pláne, potom je to objekt.

Predtým bol objektom hromada dreva, tehál, cementu atď., z ktorej bol podľa informácií z plánu postavený dom alebo objekt:

Trieda v PHP OOP je plán alebo šablóna, pomocou ktorej sa vytvorí inštancia triedy, vytvorí sa objekt. Po vytvorení triedy môžeme vytvoriť toľko objektov, koľko chceme. Na obrázku vyššie bolo vytvorených päť objektov (domov) z jednej triedy (plánu). Objekt sa bude vždy riadiť pokynmi uvedenými v triede použitej na jeho vytvorenie.

Výhody OOP v PHP:

  1. Vylepšená architektúra a čistejší kód

Objektovo orientované PHP je lepšie katalogizované a ľahšie sa balí, čo umožňuje optimálnu architektúru. Zvyčajne je každá trieda uložená v samostatnom súbore. Procedurálne jazyky sa vyznačujú zložitým kódom, ktorý je veľmi ťažké prečítať alebo pochopiť. V OOP implementáciou objektov, ktoré obsahujú súkromné ​​údaje s jasne definovanými vzťahmi medzi objektmi, je kód čitateľný a čistý.

  1. Opätovné použitie

Objektovo orientované programovanie umožňuje opätovné použitie kódu. Objekty vytvorené raz je možné použiť znova a znova. Programy je možné zostaviť kombináciou pracovných modulov namiesto písania všetkého od začiatku. To šetrí čas a zvyšuje produktivitu.

  1. Jednoduchá údržba a upgrade

Objekty majú svoje vlastné dáta a funkcie, celá ich štruktúra je kompaktná a stručná, čo uľahčuje vykonávanie zmien v kóde. Konvenčné procedurálne programovanie vytvára kód, kde je veľmi ťažké nájsť bod na zmenu. V OOP PHP môžeme pridať novú vlastnosť a potom pridať súvisiace metódy na správu tejto vlastnosti.

  1. Zapuzdrenie

Zapuzdrenie znamená, že hodnoty premenných objektu nie sú zvonku viditeľné, a preto je implementovaná bezpečnosť údajov. Ak však vznikne potreba, k údajom je možné pristupovať pomocou modifikátorov prístupu. Na vytvorenie bezpečných programov môžu byť údaje a členské funkcie v triede skryté pred ostatnými triedami. Po vytvorení objektu nie sú potrebné žiadne informácie o implementácii na jeho použitie.

  1. Dedičnosť

Dediaca trieda získa všetky charakteristiky rodičovskej triedy a potom sa k nej pridajú jej vlastné charakteristiky. Podtrieda zdedí premenné a metódy nadtriedy. Môžeme rozšíriť použitie už existujúcich tried, ako aj odstrániť nepotrebný kód.

Od autora: moderné profesionálne programovanie je jednoducho nemysliteľné bez objektovo orientovaného programovania, ktoré sa verejne nestalo akýmsi štandardom pre vysoké programovacie jazyky a, samozrejme, PHP nie je výnimkou. Stalo sa však, že prechod z procedurálneho programovacieho štýlu na objektový je pre začiatočníkov sprevádzaný určitými ťažkosťami, takže dnes zvážime základy OOP PHP.

Najprv sa pozrime na hlavné výhody objektovo orientovaného prístupu, aby sme pochopili, prečo sa tak rozšíril.

Kód objektovo orientovaného prístupu je celkom ľahko pochopiteľný a čitateľný a je skvelý na implementáciu rozsiahlych a veľmi zložitých projektov.

Aplikácie napísané pomocou tohto programovacieho prístupu sa ľahko aktualizujú a rozširujú.

Správne navrhnuté aplikácie pozostávajú zo samostatných modulov, čo znamená, že v prípade potreby je možné ich rýchlo dolaďovať a aktualizovať, čo zvyšuje rýchlosť vývoja o niekoľko rádov.

Teraz, keď boli identifikované hlavné silné stránky predmetného štýlu kódovania, môžeme prejsť priamo k podstate tejto lekcie.

V srdci objektovo orientovaného programovania v PHP je teda princíp spájania údajov a funkcií, ktoré ich manipulujú do vhodných objektov. Čo sa trochu líši od bežného procesného prístupu, kde sú podobné prvky definované oddelene od seba. To znamená, že objekty obsahujú nejaké informácie, ktoré sú uložené v ich vlastnostiach (ako sa nazývajú premenné objektu) a určitý súbor akcií, ktoré sú opísané v jeho metódach (v podstate bežné funkcie). Metódy zároveň vo svojej práci spravidla pracujú s údajmi uloženými vo vlastnostiach, čo znamená čítanie, zápis a zmenu.

Podľa toho môžeme povedať, že základom metodiky objektovo orientovaného programovania v PHP je práca s objektmi, respektíve ich používanie na manipuláciu s dátami.

V tomto prípade je objekt vytvorený z vopred definovanej triedy a táto plne popisuje jej štruktúru a funguje ako druh šablóny. Inými slovami, trieda popisuje vlastnosti a metódy budúcich vytvorených objektov. A je to vidieť na nasledujúcom príklade.

trieda Zákazník ( verejné $meno; chránené $objednávky; verejná funkcia __construct($meno, $objednávky) ( $this->name = $name; $this->orders = $orders; ) verejná funkcia getName() ( return $this ->meno; ) ) $customer = new Customer("Ben", array("id" => 10)); echo $customer->getName();

triedaZákazník(

verejné $meno;

chránené $objednávky;

verejná funkcia __construct ( $name , $orders ) (

$this -> meno = $meno;

$this -> objednávky = $objednávky ;

verejná funkcia getName()(

return $this -> meno ;

$ zákazník = nový zákazník ("Ben" , pole ("id" => 10) ) ;

echo $customer -> getName();

Pri implementácii inštancie triedy (teda vytvorení nového objektu pomocou špecifickej záujmovej triedy) sa vytvorí nový objekt a definujú sa aj vlastnosti opísané v triede. Okrem toho sa spustí špeciálna metóda s názvom __construct () na vykonanie, pokiaľ, samozrejme, nie je popísaná v štruktúre triedy. Ako vidíte, na vytvorenie objektu sa použije kľúčové slovo new, za ktorým nasleduje názov triedy. V zátvorkách, ak je to potrebné, sú uvedené argumenty pre vyššie uvedenú metódu, v ktorej sa spravidla určujú niektoré počiatočné údaje pre budúci objekt.

Vo vyššie uvedenom príklade sa okrem vytvorenia objektu zavolá metóda getName() a na obrazovke sa zobrazí ňou vrátená hodnota. Samozrejme, v dôsledku skriptu uvidíme výstup používateľského mena - „Ben“, pretože je to ten, ktorý sa odovzdá ako prvý argument metóde konštruktora, kde sa zapíše do vlastnosti triedy pod názvom názov. V súlade s tým vyššie uvedená metóda vracia hodnotu tejto vlastnosti ako výsledok svojej práce.

Zároveň vám nikto nezakazuje vytvoriť ďalší podobný objekt z vyššie opísanej triedy:

$customer2 = new Customer("Sem", array("id" => 15)); echo $customer2->getName();

$ zákazník2 = nový zákazník ("Sem" , pole ("id" => 15) );

echo $customer2 -> getName();

V tomto prípade na obrazovke uvidíme meno úplne iného používateľa - „Sem“. Z rovnakej šablóny sme teda v skutočnosti vytvorili úplne iný objekt – triedu. Tento objekt má zároveň úplne iné počiatočné dáta, ktoré sú stále tvorené metódou konštruktora, čo znamená, že aj jeho správanie, určené metódami, bude iné.

Upozorňujeme, že vlastnosti triedy a jej metód je možné použiť iba s konkrétnym objektom - presne to je vidieť v príklade a bez toho sú absolútne zbytočné z hľadiska práce mimo triedy, pretože vo vnútri triedy , samozrejme, môžu byť použité v kóde jeho metód. Okrem toho sa prístup k vyššie uvedeným prvkom objektu vykonáva prostredníctvom špeciálnej sady znakov „->“ (šípka), pred ktorou musíte zadať objekt záujmu alebo ukazovateľ objektu - kľúčové slovo $this. Ukazovateľ objektu $this sa používa v kóde metódy priamo vo vnútri triedy na prístup k jej vlastnostiam alebo metódam.

A opäť vidíme, že základom vývoja OOP v PHP je práca s objektmi a krása spočíva v tom, že triedu popíšeme raz, čiže vytvoríme určitý súbor údajov a potrebnú funkcionalitu. A potom vytvoríme objekty, z ktorých každý bude v závislosti od počiatočných údajov v skutočnosti úplne jedinečný.

Z uvedeného vyplýva, že trieda – na základe ktorej budú objekty vytvorené, popisuje dáta a funkčnosť určitej entity budúceho projektu, napríklad prácu s používateľmi, stránkami, menu, adresami atď. A samozrejme, ak je takýchto entít viacero, tak treba vytvoriť niekoľko tried, čo znamená, že pre každú z nich bude vytvorený aspoň jeden objekt. Aj keď nie vždy, niekedy sú niektoré triedy vytvorené ako rodičia pre určité detské triedy, čo znamená, že fungujú ako úložisko niektorých spoločných funkcií, čo samo osebe znamená vytvorenie celej hierarchie triedy budúceho projektu. Ale to je úplne iná téma, ktorá nezapadá do rozsahu aktuálneho článku.

V skutočnosti sme si tu stručne zopakovali základy objektovo orientovaného programovania v PHP. Samozrejme, že tento druh programovania si vyžaduje viac pozornosti ako jeden článok, ak sa v ňom chcete naozaj zdokonaliť a použiť ho vo svojom vývoji. Táto téma je podrobnejšie rozobratá v prémiovom kurze.

Všetko najlepšie a šťastné kódovanie!!!

V tomto návode sa naučíte základy objektovo orientovaného programovania v PHP. Dozviete sa všeobecne o princípoch OOP a naučíte sa písať jednoduché skripty v PHP.

Vitajte pri prvej zo série lekcií OOP v PHP! Nasledovaním všetkých lekcií v tejto sérii sa dozviete o základných princípoch a konceptoch OOP a naučíte sa, ako rýchlo a jednoducho vytvárať užitočné aplikácie v PHP.

V tomto návode vás začnem privádzať do tempa a predstavím vám základné koncepty OOP. Naučíš sa:

  • čo je OOP
  • ako vám OOP môže pomôcť písať lepšie PHP skripty
  • niektoré základné pojmy ako triedy, objekty, metódy, premenné tried
  • ako začať písať PHP skript

Ste pripravení ponoriť sa do sveta objektov PHP? Potom pokračujte!

Čo je objektovo orientované programovanie?

Ak ste niekedy vytvorili svoje vlastné funkcie v PHP a používali ich, potom ste použili procedurálny štýl programovania. V procedurálnom programovaní zvyčajne vytvárate dátové štruktúry – čísla, reťazce, polia atď. - uložiť nejaké údaje a následne tieto štruktúry spracovať špeciálnymi funkciami, ktoré s týmito údajmi manipulujú.

Objektovo orientované programovanie alebo OOP sa posunulo ďalej, pretože tu ukladáme dátové štruktúry a funkcie, ktoré ich spracúvajú, do jedinej entity nazývanej objekt. Namiesto spracovania údajov pomocou nejakej funkcie načítate tieto údaje do objektu a potom zavoláte jeho metódy, aby ste s nimi manipulovali a získali požadovaný výsledok.

Objekty vytvorené pomocou OOP najčastejšie odrážajú skutočné entity. Ak napríklad vytvárate fórum pre svoju stránku, mali by ste vytvoriť objekt Member, ktorý bude uchovávať informácie o každom členovi fóra (meno, prihlasovacie meno, e-mailová adresa, heslo atď.), ako aj metódy, ktoré budú tieto informácie spracovávať. (registrácia, autorizácia, odhlásenie, zákaz atď.).

Prečo používať OOP?

Procedurálne a objektovo orientované sú dva rôzne spôsoby vykonávania tej istej veci. Tým nechcem povedať, že jeden z nich je lepší ako druhý – každý si píše, ako sa mu páči, takže tieto dva prístupy môžete dokonca jednoducho skombinovať v jednom scenári.

Tu sú však niektoré z výhod OOP pre vývojárov:

  • Je jednoduchšie odrážať skutočné situácie: ako som už uviedol vyššie, objekty odrážajú skutočné entity - ľudí, produkty, karty, články na blogu atď. To značne zjednodušuje úlohu, keď práve začínate navrhovať svoju aplikáciu, pretože účel každého objektu , rovnako ako cieľové vzťahy medzi objektmi budú jasné a zrozumiteľné.
  • Jednoduchšie písanie modulárnych programov: OOP je o písaní modulov. Rozdelením kódu do modulov sa vám bude jednoduchšie spravovať, ladiť a rozširovať.
  • Je jednoduchšie napísať kód, ktorý sa bude používať mnohokrát: písanie kódu, ktorý možno použiť viackrát, ušetrí čas pri písaní aplikácie a časom si dokonca môžete vytvoriť celú knižnicu takýchto modulov, ktoré môžete použiť v mnohých aplikácie. S OOP je písanie takéhoto kódu pomerne jednoduchšie, pretože dátové štruktúry a funkcie sú zapuzdrené v jedinom objekte, ktorý možno použiť ľubovoľne veľakrát.

Niektoré základné pojmy

Skôr ako začnete písať skripty, musíte dobre porozumieť pojmom ako trieda, objekt, premenná triedy a metóda.

triedy

Trieda je rámec pre objekt. Toto je časť kódu, ktorá definuje:

  • Typy údajov, ktoré budú obsahovať vygenerované objekty triedy
  • Funkcie, ktoré budú tieto objekty obsahovať.

Keď vytvoríte aplikáciu OOP, zvyčajne vytvoríte niekoľko tried, ktoré predstavujú rôzne typy entít vo vašej aplikácii. Ak chcete napríklad vytvoriť fórum, môžete vytvoriť triedy Fórum, Téma, Príspevok a Člen.

Objekty

Objekt je špeciálny typ premennej, ktorá sa vytvára prostredníctvom triedy. Obsahuje skutočné údaje a funkcie na manipuláciu s nimi. Z jednej triedy môžete vytvoriť toľko objektov, koľko chcete. Každá funkcia objektu je nezávislá od iného objektu, aj keď sú odvodené z rovnakej triedy.

Pre porovnanie so skutočnými entitami:

  • Trieda je rámec pre auto: definuje, ako bude auto vyzerať a pôsobiť, ale stále je to abstraktná entita.
  • Objekt je skutočné auto vyrobené z rámu: má skutočné vlastnosti (napríklad rýchlosť) a správanie (napríklad zrýchľovanie alebo brzdenie).

Poznámka: Objekt sa často označuje ako entita triedy a proces vytvárania objektu triedy sa označuje ako implementácia.

premenné triedy

Dátové hodnoty, ktoré sú uložené v objekte, sú uložené v špeciálnych premenných nazývaných premenné triedy. Premenné triedy úzko súvisia s jej objektom. Aj keď všetky objekty triedy majú rovnaké premenné, ich hodnoty sa môžu líšiť.

Metódy

Funkcie definované v triede a aplikované na objekty tejto triedy sa nazývajú metódy. Veľmi sa nelíšia od bežných funkcií – môžete im odovzdávať hodnoty, môžu obsahovať lokálne premenné a návratové hodnoty. Metódy však častejšie pracujú s objektovými premennými. Napríklad metóda login() na prihlasovanie používateľov do vášho fóra môže nastaviť hodnotu premennej triedy prihlásený na hodnotu true.

Ako vytvoriť triedu v PHP?

Teraz, keď už viete, čo sú triedy, metódy, premenné tried a objekty, je čas vytvoriť niekoľko tried a objektov v kóde PHP.

Najprv sa pozrime, ako vlastne potrebujete vytvoriť triedu. Skript na vytvorenie triedy v podstate vyzerá takto:

Trieda Názov triedy ( // (definícia triedy) )

Ak napríklad vytvárate triedu členov pre svoje fórum, napíšte:

Člen triedy ( // (definícia triedy) )

Je to dosť jednoduché. Prirodzene, táto trieda nebude robiť nič, kým do nej nepridáte premenné a metódy. Vyššie uvedený kód však vytvára platnú triedu PHP, ktorú možno použiť.

Základné pravidlo: vložte každú triedu do samostatného súboru s názvom, ktorý sa zhoduje s názvom triedy. Napríklad vložte triedu Member do súboru Member.php a uložte ju do priečinka, povedzme class.

Ako vytvoriť objekty v PHP?

Objekt môžete vytvoriť pomocou nového kľúčového slova:

Nový názov triedy()

Tento kód vytvorí objekt triedy ClassName. Neskôr budete musieť tento objekt použiť, takže ho musíte uložiť do premennej. Vytvorme si napríklad objekt triedy Member a uložme ho do premennej $member:

$člen = nový člen();

Môžeme tiež vytvoriť iný objekt rovnakej triedy:

$člen2 = nový člen();

Aj keď sme vytvorili tieto dva objekty z rovnakej triedy, premenné $member a $member2 sú na sebe nezávislé.

Vytváranie premenných tried

Teraz, keď vieme, ako vytvárať triedy a objekty tried, pozrime sa, ako vytvoriť premenné triedy. Existujú 3 prístupové identifikátory pre premenné triedy, ktoré možno pridať do triedy:

  • Verejné premenné triedy (public): dostupné - t.j. možno ich čítať a/alebo upravovať – kdekoľvek v skripte, bez ohľadu na to, kde sa tento kód nachádza – v triede alebo mimo nej
  • Súkromné ​​premenné triedy (súkromné): dostupné len pre metódy triedy. Najlepšie je nastaviť premenné triedy ako súkromné, aby ste oddelili objekty od zvyšku kódu.
  • Chránené premenné triedy (chránené): dostupné pre metódy vlastnej triedy ako aj metódy zdedených tried (o dedičnosti si povieme neskôr).

Ak chcete vytvoriť premennú triedy, napíšte kľúčové slovo public, private alebo protected a potom zadajte názov premennej:

Trieda ClassName (verejné $propertyName; súkromné ​​$propertyName; chránené $propertyName; )

Pridajme do našej triedy Member premennú verejnej triedy na uloženie používateľského mena:

Člen triedy ( public $username = ""; )

Všimnite si, že sme inicializovali našu premennú triedy, jej hodnotou je prázdny reťazec „“. To znamená, že keď sa vytvorí nový používateľ, používateľské meno bude predvolene obsahovať prázdny reťazec. Rovnako ako v prípade bežných premenných v PHP, premenné triedy nemusia byť inicializované, ale je lepšie nebyť lenivý. Ak neinicializujete premennú triedy, jej hodnota je štandardne null.

Prístup k premenným triedy

Na prístup k premennej objektu použite operátor ->:

$object->propertyName

Vyskúšajme. Napíšme skript, ktorý deklaruje triedu Member a premennú triedy, vytvorí objekt tejto triedy a potom nastaví hodnotu premennej triedy a zobrazí ju na obrazovke:

username="fred"; echo $member->username; // Tlač "Fred" ?>

Spustite tento kód, zobrazí sa reťazec "Fred", hodnota premennej triedy $member->username. Ako vidíte, s objektovou premennou pracujete rovnakým spôsobom ako s normálnou premennou – môžete jej dať hodnotu a prečítať ju.

Pridávanie metód do triedy

A čo vytváranie metód? Ako som už spomenul, metódy sú normálne funkcie, ktoré sú súčasťou triedy. Možno vás teda neprekvapí, že sú vytvorené pomocou rovnakého kľúčového slova. Jediný rozdiel oproti vytváraniu bežných funkcií je v tom, že do jeho deklarácie môžete pridať aj jeden z prístupových identifikátorov (verejný, súkromný, chránený). V tomto sú metódy podobné premenným triedy:

Trieda Názov triedy ( public function methodName() ( // (kód) ) súkromná funkcia methodName() ( // (kód) ) chránená funkcia methodName() ( // (code) ) )

Poznámka: rovnako ako v prípade premenných triedy, verejné metódy možno volať odkiaľkoľvek, súkromné ​​metódy možno volať len v rámci triedy a chránené metódy možno volať zo samotnej triedy a jej nástupcu.

Skúsme do našej triedy pridať nejaké metódy a premenné triedy:

  • súkromná premenná triedy $loggedIn na identifikáciu používateľa, t.j. či šiel alebo nie
  • metóda login(), ktorá sa prihlási do fóra nastavením hodnoty premennej triedy $loggedIn na hodnotu true,
  • metóda logout(), ktorá sa odhlási z fóra nastavením hodnoty premennej triedy $loggedIn na false,
  • metóda isLoggedIn(), ktorá vráti hodnotu premennej triedy $loggedIn.

Tu je náš kód:

prihlásený = true; ) verejná funkcia logout() ( $this->loggedIn = false; ) verejná funkcia isLoggedIn() ( return $this->prihlásené; ) ) ?>

Možno ste si všimli, že sme použili nové kľúčové slovo $this. V kontexte objektových metód špeciálna premenná $this odkazuje na samotný objekt. Použitím $this v objektovej metóde môže metóda pristupovať k akejkoľvek premennej triedy a objektovej metóde.

Napríklad metóda login() môže pristupovať k premennej triedy $loggedIn objektu cez $this->loggedIn.

Mimochodom, naša premenná triedy je súkromná, takže ju nemožno volať zo žiadnej časti skriptu, ale iba z metód login(), logout() a isLoggedIn(). Je to dobrý prístup, pretože vnútorná časť objektu (napríklad ako presne sa zaznamenáva, či je používateľ prihlásený alebo nie) je oddelená od zvyšku kódu. Vždy, keď je to možné, skúste použiť premenné súkromnej triedy, aby boli vaše objekty samostatné, prenosné a bezpečné.

Poznámka: premenná triedy $username v našom príklade je verejná. Urobil som to len preto, aby som ukázal, ako môžete pristupovať k premenným triedy objektu. V skutočných projektoch je pravdepodobnejšie, že táto premenná bude súkromná a vytvorí sa špeciálne premenné verejnej triedy na nastavenie hodnôt používateľského mena v prípade potreby.

Použitie metód

Ak chcete volať metódu na objekte, použite operátor ->, s ktorým ste sa oboznámili.

$object->methodName()

Funguje to rovnako ako volanie normálnej funkcie. Argumenty môžete zadať v zátvorkách (samozrejme za predpokladu, že sú potrebné nejaké argumenty), volanie metódy môže tiež vrátiť určité hodnoty, ktoré potom môžete použiť.

prihlásený = true; ) verejná funkcia logout() ( $this->prihlásený = false; ) verejná funkcia isLoggedIn() ( return $this->prihlásený; ) ) $člen = nový člen(); $member->username = "Fred"; echo $member->username . " je " . ($member->
"; $member->login(); echo $member->username . " je " . ($member->isLoggedIn() ? "prihlásený" : "odhlásený") ."
"; $member->logout(); echo $member->username . " je " . ($member->isLoggedIn() ? "prihlásený" : "odhlásený") ."
"; ?>

Tento skript zobrazí nasledovné:

Fred je prihlásený Fred je prihlásený Fred je odhlásený

Funguje to takto:

  1. Po definovaní triedy Member sme vytvorili jej objekt a uložili ho do premennej $member. Tiež sme nastavili premennú triedy $username tohto objektu na "Fred".
  2. Potom sme zavolali metódu $member->isLoggedIn(), aby sme zistili, či je používateľ prihlásený alebo nie. Táto metóda jednoducho vráti hodnotu premennej triedy $loggedIn. Keďže predvolená hodnota tejto premennej triedy je false, volanie $member->isLoggedIn() bude mať za následok false, takže sa zobrazí správa „Fred je odhlásený“.
  3. Potom zavoláme metódu login(). Nastaví premennú triedy $loggedIn na hodnotu true.
  4. Teraz, keď sa zavolá metóda $member->isLoggedIn(), vráti sa true a zobrazí sa správa „Fred je prihlásený“.
  5. Zavolajme metódu logout(), ktorá nastaví hodnotu vlastnosti $loggedIn na false.
  6. Tretíkrát zavoláme metódu $member->isLoggedIn(). Teraz vráti hodnotu false, pretože hodnota vlastnosti $loggedIn je opäť nastavená na hodnotu false. Takže sa znova zobrazí správa „Fred je odhlásený“.

Poznámka: v prípade, že ste prvýkrát videli toto: ?:, je ternárny operátor. Toto je zjednodušená verzia blokov if...else. O takýchto operátoroch sa môžete dozvedieť.

závery

V tomto návode ste sa naučili základy OOP v PHP. Dozvedeli ste sa o veciach ako:

  • čo je OOP a prečo je užitočné ho používať
  • koncepcie tried, objektov, premenných tried a metód
  • ako vytvárať triedy a objekty
  • ako vytvárať a používať premenné triedy
  • koncepty prístupových identifikátorov verejný, súkromný, chránený
  • ako vytvoriť a použiť metódy triedy

Veľa ste sa už naučili a ešte veľa sa naučíte v nasledujúcich lekciách. Ak ste však dobre prepracovali všetky príklady, ktoré som uviedol, máte pevný základ. Môžete začať vytvárať OOP aplikácie.

Vývoj webových aplikácií pomocou objektovo orientovaného prístupu v PHP môže byť spočiatku mätúci pre tých vývojárov, ktorí sú zvyknutí používať procedurálny prístup, ale v skutočnosti v OOP nie je nič zložité. V tomto kurze zvážime teoretické aspekty OOP a naučíme sa aplikovať získané poznatky v praxi.

Kurz pozostáva zo 17 lekcií, v ktorých sa krok za krokom naučíme základy OOP, čo by malo stačiť na písanie aplikácií v objektovom štýle.

Po preštudovaní tohto kurzu pochopíte, čo je objektovo orientované programovanie, naučíte sa, čo sú triedy a objekty a pochopíte aj rozdiel medzi nimi. Získajte informácie o vlastnostiach, metódach a konštantách tried.

Po absolvovaní kurzu budete môcť používať dedičnosť tried na vytváranie pohodlnej a flexibilnej logiky pre vašu webovú aplikáciu, vytváranie rozvetvených hierarchií tried. Budete môcť prepísať metódy a tým rozšíriť ich funkčnosť, vytvárať abstraktné triedy. Z kurzu sa naučíte význam používania rozhraní a naučíte sa ich používať tam, kde je to skutočne potrebné, a nepoužívať rozhrania kvôli rozhraniam. Zvláštna pozornosť v kurze je venovaná téme autoloading tried, ktoré eliminujú dlhé zoznamy zahrnutých súborov. Tu sa dozviete o funkciách automatického načítania a naučíte sa, ako na tento účel používať správcu balíkov Composer.

To všetko a oveľa viac sa dozviete z lekcií navrhovaného kurzu OOP v PHP.

Všetky lekcie kurzu:

Popis kurzu: V tomto kurze sa budeme zaoberať teoretickými aspektmi OOP, ako aj naučiť sa aplikovať získané poznatky v praxi. Kurz pozostáva zo 17 lekcií, v ktorých sa krok za krokom naučíme základy OOP, čo by malo stačiť na písanie aplikácií v objektovom štýle.