2. diel - Prvý objektová aplikácie v PHP
V minulej lekcii, Úvod do objektovo orientovaného programovania v PHP , sme si vysvetlili prečo OOP vzniklo a načali ako OOP vyzerá. V dnešnom tutoriále sa budeme venovať tomu ako OOP funguje a vytvoríme si svoju prvú objektovú aplikáciu v PHP.
Ako OOP funguje
OOP nám umožňuje nasimulovať realitu tak, ako ju sme zvyknutí vnímať. Môžeme teda povedať, že sa odpútavame od toho, ako program vidí počítač (stroj) a píšeme program skôr z pohľadu programátora (človeka). Ako sme vtedy nahradili assembler ľudsky čitateľnými matematickými zápisy, teraz ideme ešte ďalej a nahradíme aj tie. Ide teda o určitú úroveň abstrakcie nad programom. To má značné výhody už len v tom, že je to pre nás prirodzenejšie a prehľadnejšie.
Základnou jednotkou je objekt, ktorý zodpovedá nejakému objektu z reálneho sveta (napr. Objekt človek alebo databázy).
Objekt má svoje atribúty a metódy.
Atribúty
Atribúty objektu sú vlastnosti čiže dáta, ktoré uchováva (napr. U človeka $ meno a $ vek, u databázy $ heslo). Jedná sa vlastne premenné, s ktorými sme už stokrát pracovali. Niekedy o nich hovoríme ako o vnútornom stave objektu. Atribút na rozdiel od premenných, ktoré sme používali predtým, patrí nejakému objektu.
Metódy
Metódy sú schopnosťami, ktoré vedia objekt vykonávať. U človeka by to mohli byť metódy: jdiDoPrace (), pozdrav () alebo mrkni (). U databázy pridejZaznam () alebo vyhľadaj ()). Metódy môžu mať parametre a môžu tiež vracať nejakú hodnotu. Od funkcií sa líši tým, že metóda patrí objektu, zatiaľ čo funkcia nepatrí nikam (to je tiež problém neobjektového kódu).
Jazyk PHP nie je objektovo založený, len objektovo orientovaný. To znamená, že v ňom možno programovať objektovo, ale vnútorné funkcie jazyka objektové nie sú. Je to samozrejme z dôvodu, že PHP vzniklo v čase, keď OOP nebolo toľko rozšírené. Hoci je situácia s každou verziou lepšie a lepšie, je tu dokonale vidieť ako príšerne vyzerá väčší projekt bez použitia OOP.
PHP obsahuje stovky voľných funkcií, ktoré nikam nepatria. Je ich toľko, že sa v nich už nikto nevyzná. Napr. väčšina funkcií na poli začína názvom array_ (napr. array_reverse ()), funkcie k zotriedenie poľa sa však volá len sort (). Keby funkcie patrili objekte poľa, tieto problémy by neexistovali a človek by nemusel tráviť toľko času v manuáli. To isté platí u konštánt. Našťastie aj samotní vývojári PHP začínajú chápať, že sú objekty potreba a dodávajú objekty napr. Pre prácu s dátumom a časom, databáz a podobne.
Trieda
Aby sme si vytvorili objekt, musíme si najprv vytvoriť tzv. Triedu. Trieda je vzor, podľa ktorého sa objekty vytvára. Definuje ich vlastnosti a schopnosti.
Objekt, ktorý sa vytvorí podľa triedy, sa nazýva inštancia. Instance majú rovnaké rozhranie ako trieda, podľa ktorej sa vytvára, ale navzájom sa líšia svojimi dátami (atribúty). Majme napríklad triedu Človek a od nej si vytvorme inštancie $ karel a $ josef. Obe inštancie majú iste tie isté metódy a atribúty ako trieda (napr. $ Meno a $ vek) a metódy (jdiDoPrace () a pozdrav ()). Hodnoty v ich atribútoch sa však samozrejme líši (prvá inštancia má v atribútu meno hodnotu "Karel" a vo vek 22, druhá "Jozef" a 45).
Samotné objektovo orientované programovanie pojem objekt vlastne vôbec nepozná, rozlišuje iba triedu a inštanciu. Ak napíšem v článku objekt, mám na mysli inštanciu.
Komunikácia medzi objektmi prebieha pomocou odovzdávania správ, vďaka čomu je syntaxe prehľadná. Správa zvyčajne vyzerá takto: $ příjemce-> jménoMetody ($ parametre). Napr. $ Karel-> pozdrav ($ susedka) by mohol spôsobiť, že inštancia $ karel pozdravia inštanciu $ susedka.
PHP a objekty
PHP podporovalo objekty už niekde vo verzii 4, ich implementácia ale bola tak príšerná, že ich nikto nepoužíval. Ďalší pokus prebehol vo verzii 5, kde sa PHP začalo výrazne inšpirovať úspešným objektovým jazykom Java. Od tejto verzie sa v PHP programuje objektovo vcelku dobre a od verzie 5.3 je to veľmi dobre objektovo orientovaný jazyk. Tento seriál budem písať pre PHP verzie 5.3 a vyššie. Aj verzia 5.3 je už staršieho dáta a ešte staršie PHPčka beží snáď len na nejakých nekvalitných freehostinzích. Z tých lepších je napr. ENDOR, kde majú PHP 5.4, u platených webhostingov je aktuálna PHP samozrejmosťou. Okrem iného sa nemá zmysel učiť zastarané veci čo prestanú v budúcnosti fungovať, takže pôjdeme objekty tak, ako sú v aktuálnych verziách.
Prvý objektová aplikácie
Vytvorenie triedy
Pristúpme teda k vytvoreniu našej prvej objektové aplikácie. Zatiaľ budeme vytvárať len veľmi jednoduché triedy, pretože sa na nich dobre vysvetľuje nová teória. Časom zistíme, že sa objekty reálne na webe používajú ešte trochu inak, ale na to máme veľa času.
Definujme si triedu Clovek, ktorá nám umožní vytvárať inštancie ľudí.
Triedy píšeme do samostatných súborov a tieto súbory pomenovávame rovnako, ako sa volá trieda. K pomenovávanie tried používame tzv. Ťaví notáciu (Camel Case), kedy trieda začína na veľké písmeno a ak má viac slov, píšeme ich dohromady a každé nové slovo opäť s veľkým písmenom. Triedy je dobré mať v nejakej zložke, vytvorme si teda zložku "tridy" a v nej súbor Clovek.php. Keďže väčšina serverov linoxových, záleží na veľkosti písmen as clovek.php to fungovať nebude.
Obsah súboru bude nasledujúci:
<?php class Clovek { }
Triedu sme definovali kľúčovým slovom class a vytvorili jej blok zo zložených zátvoriek, kam budeme písať jej prvky. Všimnite si, že sme PHP direktívu na začiatku súboru iba otvorili, ale už neuzavreli. Je to odporúčaná praktika, pretože v súbore nebude žiadne HTML a preto by sa malo PHP otvoriť hneď na začiatku a ak ho neuzavrieme, platia až na koniec súboru.
Metódy
Budeme chcieť, aby naši ľudia niečo vedeli. Začnime jednoducho tým, že je naučíme pozdraviť. Zatiaľ len tak, že vypíšu "Ahoj". Prijme si do triedy metódu pozdrav:
<?php class Clovek { public function pozdrav() { echo('Ahoj'); } }
Metóda nápadne pripomína funkciu, len má pri sebe tzv. Modifikátor prístupu public. To znamená, že budeme schopní túto metódu na inštanciu zvonku volať. To by bolo v súbore Clovek.php pre dnešok všetko.
Vráťme sa do zložky s projektom a vytvorme súbor index.php. Súbor s triedou musíme načítať pomocou require, len tak budeme schopní vytvoriť jej inštanciu. Aby sme sa vyvarovali problémom, použijeme require_once, ktoré triedu načíta len v prípade, že načítané nie je. Následne vytvoríme inštanciu triedy Clovek a prikáže ju, aby nás pozdravila.
<?php require_once('tridy/Clovek.php'); $karel = new Clovek(); $karel->pozdrav();
<?php class Clovek { public function pozdrav() { echo('Ahoj'); } }
Instance ukladáme jednoducho do premenných. Premenná by sa samozrejme mala vymenovať podľa toho čo v nej je. Inštanciu vytvoríme pomocou kľúčového slova new, za ktorým nasleduje názov triedy a potom zátvorky. Zátvorky nie sú povinné, ale je lepšie je tam písať. Na inštanciu teraz môžeme volať metódy, ktoré sú v triede definované. Metódy voláme pomocou operátora šípky a jedná sa v podstate o vylepšenej volanie funkcií, ako sme to robili predtým.
Výstup programu teraz bude:
Zdrojový kód aplikácie máte v prílohe.
Naša aplikácia teraz pracuje s objektom a aj keď by sme ju zatiaľ mohli nahradiť jednoduchým echo 'Ahoj', v budúcnosti sa nám objekty veľmi oplatí. Až bude kódu viac, bude stále prehľadný. V budúcej lekcii, Atribúty a magické metódy v PHP , sa zameriame na atribúty objektov a tzv. Magické metódy.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 1353x (1.49 kB)
Aplikácia je vrátane zdrojových kódov v jazyku PHP