Lekce 2 - První objektová aplikace v PHP
V minulé lekci, Úvod do objektově orientovaného programování v PHP, jsme si vysvětlili proč OOP vzniklo a nakousli jak OOP vypadá.
V dnešním tutoriálu se budeme věnovat tomu jak OOP funguje a vytvoříme si svou první objektovou aplikaci v PHP.
Jak OOP funguje
OOP nám umožňuje nasimulovat realitu tak, jak ji jsme zvyklí vnímat. Můžeme tedy říci, že se odpoutáváme od toho, jak program vidí počítač (stroj) a píšeme program spíše z pohledu programátora (člověka). Jako jsme tehdy nahradili assembler lidsky čitelnými matematickými zápisy, nyní jdeme ještě dál a nahradíme i ty. Jde tedy o určitou úroveň abstrakce nad programem. To má značné výhody už jen v tom, že je to pro nás přirozenější a přehlednější.
Základní jednotkou je objekt, který odpovídá nějakému objektu z reálného světa (např. objekt člověk nebo databáze).
Objekt má své atributy a metody.
Atributy
Atributy objektu jsou vlastnosti neboli data, která
uchovává (např. u člověka $jméno
a $věk
, u
databáze $heslo
). Jedná se vlastně o proměnné, se kterými
jsme již stokrát pracovali. Někdy o nich hovoříme jako o vnitřním stavu
objektu. Atribut na rozdíl od proměnných, které jsme používali dříve,
patří nějakému objektu.
Metody
Metody jsou schopnostmi, které umí objekt vykonávat. U
člověka by to mohly být metody: jdiDoPrace()
,
pozdrav()
nebo mrkni()
. U databáze
pridejZaznam()
nebo vyhledej()
). Metody mohou mít
parametry a mohou také vracet nějakou hodnotu. Od funkcí se liší tím, že
metoda patří objektu, zatímco funkce nepatří nikam (to je také problém
neobjektového kódu).
Jazyk PHP není objektově založený, jen objektově orientovaný. To znamená, že v něm lze programovat objektově, ale vnitřní funkce jazyka objektové nejsou. Je to samozřejmě z důvodu, že PHP vzniklo v době, kdy OOP nebylo tolik rozšířené. Ačkoli je situace s každou verzí lepší a lepší, je zde dokonale vidět jak příšerně vypadá větší projekt bez použití OOP.
PHP obsahuje stovky volných funkcí, které nikam nepatří. Je jich tolik,
že se v nich již nikdo nevyzná. Např. většina funkcí na poli začíná
názvem array_
(např. array_reverse()
), funkce k
setřídění pole se však jmenuje jen sort()
. Kdyby funkce
náležely objektu pole, tyto problémy by neexistovaly a člověk by nemusel
trávit tolik času v manuálu. To samé platí u konstant. Naštěstí i
samotní vývojáři PHP začínají chápat, že jsou objekty potřeba a
dodávají objekty např. pro práci s datem a časem, databází a
podobně.
Třída
Abychom si vytvořili objekt, musíme si nejprve vytvořit tzv. třídu. Třída je vzor, podle kterého se objekty vytváří. Definuje jejich vlastnosti a schopnosti.
Objekt, který se vytvoří podle třídy, se nazývá
instance. Instance mají stejné rozhraní
jako třída, podle které se vytváří, ale navzájem se liší svými daty
(atributy). Mějme například třídu Člověk a od ní si vytvořme
instance $karel
a $josef
. Obě instance mají jistě
ty samé metody a atributy jako třída (např. $jméno
a
$věk
) a metody (jdiDoPrace()
a
pozdrav()
). Hodnoty v jejich atributech se však samozřejmě
liší (první instance má v atributu jméno hodnotu "Karel" a ve věk 22,
druhá "Josef" a 45).
Samotné objektově orientované programování pojem objekt vlastně vůbec nezná, rozlišuje pouze třídu a instanci. Pokud napíši v článku objekt, mám na mysli instanci.
Komunikace mezi objekty probíhá pomocí předávání zpráv, díky čemuž
je syntaxe přehledná. Zpráva obvykle vypadá takto:
$příjemce->jménoMetody($parametry);
. Např.
$karel->pozdrav($sousedka);
by mohl způsobit, že instance
$karel
pozdraví instanci $sousedka
.
PHP a objekty
PHP podporovalo objekty již někde ve verzi 4, jejich implementace ale byla tak příšerná, že je nikdo nepoužíval. Další pokus proběhl ve verzi 5, kde se PHP začalo výrazně inspirovat úspěšným objektovým jazykem Java. Od této verze se v PHP programuje objektově vcelku dobře a od verze 5.3 je to velmi dobře objektově orientovaný jazyk. Tento seriál budu psát pro PHP verze 8.1 a vyšší. I verze 5.3 je již staršího data a ještě starší PHPčka běží snad jen na nějakých nekvalitních freehostinzích. Z těch lepších je např. Endora, kde mají na freehostingu k dispozici jako nejnovější verzi PHP 7.4. U placených webhostingů je aktuální PHP samozřejmostí. Mimo jiné se nemá smysl učit zastaralé věci co přestanou v budoucnu fungovat, takže pojedeme objekty tak, jak jsou v aktuálních verzích.
První objektová aplikace
Přistupme tedy k vytvoření naší první objektové aplikace. Zatím budeme vytvářet pouze velmi jednoduché třídy, jelikož se na nich dobře vysvětluje nová teorie. Časem zjistíme, že se objekty reálně na webu používají ještě trochu jinak, ale na to máme spoustu času.
Vytvoření třídy
Definujme si třídu Clovek
, která nám umožní vytvářet
instance lidí.
Třídy píšeme do samostatných souborů a tyto soubory pojmenováváme
stejně, jako se jmenuje třída. K pojmenovávání tříd používáme tzv.
PascalCase, kdy třída začíná na velké písmeno a pokud má více slov,
píšeme je dohromady a každé nové slovo opět s velkým písmenem. Třídy
je dobré mít v nějaké složce, vytvořme si tedy složku tridy/
a v ní soubor Clovek.php
. Jelikož je většina serverů
linuxových, záleží na velikosti písmen a s clovek.php
to
fungovat nebude.
Obsah souboru bude následující:
<?php class Clovek { }
Třídu jsme definovali klíčovým slovem class
a vytvořili
jí blok ze složených závorek, kam budeme psát její prvky. Všimněte si,
že jsme PHP direktivu na začátku souboru pouze otevřeli, ale již
neuzavřeli. Je to doporučená praktika, protože v souboru nebude žádné
HTML a proto by se mělo PHP otevřít hned na začátku a pokud ho neuzavřeme,
platí až na konec souboru.
Metody
Budeme chtít, aby naši lidé něco uměli. Začněme jednoduše tím, že je naučíme pozdravit. Zatím jen tak, že vypíší "Ahoj". Přidejme si do třídy metodu pozdrav:
<?php class Clovek { public function pozdrav() : void { echo('Ahoj'); } }
Metoda nápadně připomíná funkci, jen má u sebe tzv. modifikátor
přístupu public
. To znamená, že budeme schopni tuto metodu na
instanci zvenčí volat. To by bylo v souboru Clovek.php
pro
dnešek vše.
Vraťme se do složky s projektem a vytvořme soubor index.php
.
Soubor s třídou musíme načíst pomocí funkce require()
, jen
tak budeme schopni vytvořit její instanci. Abychom se vyvarovali problémům,
použijeme funkci require_once()
, která třídu načte jen v
případě, že načtená ještě není. Následně vytvoříme instanci třídy
Clovek
a přikážeme ji, aby nás pozdravila:
<?php require_once('tridy/Clovek.php'); $karel = new Clovek(); $karel->pozdrav();
<?php class Clovek { public function pozdrav() : void { echo('Ahoj'); } }
Instance ukládáme jednoduše do proměnných. Proměnná by se samozřejmě
měla jmenovat podle toho, co v ní je. Instanci vytvoříme pomocí
klíčového slova new
, za kterým následuje název třídy a
poté závorky. Závorky nejsou povinné, ale je lepší je tam psát. Na
instanci nyní můžeme volat metody, které jsou ve třídě definovány.
Metody voláme pomocí operátoru šipky a jedná se v podstatě o vylepšené
volání funkcí, jako jsme to dělali dříve.
Výstup programu nyní bude:
Zdrojový kód aplikace máte v příloze.
Naše aplikace nyní pracuje s objektem a i když bychom ji zatím mohli
nahradit pouhým zavoláním echo('Ahoj')
, v budoucnu se nám
objekty velmi vyplatí. Až bude kódu více, bude stále přehledný.
V příští lekci, Atributy a magické metody v PHP, se zaměříme na atributy objektů a tzv. magické metody.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 1353x (1.49 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP