Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

2. díl - První objektová aplikace v PHP

PHP Objektově orientované programování První objektová aplikace v PHP American English version English version

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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).

Objekty v objektově orientovaném programování

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ě 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).

Objekty v objektově orientovaném programování

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).

Objekty v objektově orientovaném programování

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($pa­rametry). 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 5.3 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í PHP 5.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

Vytvoření třídy

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.

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. velbloudí notaci (Camel Case), 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ů linoxový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řijme si do třídy metodu pozdrav:

<?php
class Clovek
{

        public function pozdrav()
        {
                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í require, jen tak budeme schopni vytvořit její instanci. Abychom se vyvarovali problémům, použijeme require_once, které třídu načte jen v případě, že načtená není. Následně vytvoříme instanci třídy Clovek a přikážeme jí, aby nás pozdravila.

<?php
require_once('tridy/Clovek.php');

$karel = new Clovek();
$karel->pozdrav();

?>

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:

Your page
localhost

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 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.


 

Stáhnout

Staženo 963x (471 B)
Aplikace je včetně zdrojových kódů v jazyce PHP

 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
36 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity (5)

 

 

Komentáře
Zobrazit starší komentáře (10)

Avatar
malevil
Člen
Avatar
malevil:5.3.2014 20:39

Konečně jsem to... pochopil... díky

 
Odpovědět 5.3.2014 20:39
Avatar
Bebbana
Člen
Avatar
Bebbana:2.10.2015 1:17

Ahoj Davide, moc děkuji za další přehledný článek. Předem se omlouvám za OT v tomhle článku, jen jsem chtěla říct, že jseš tady suverenně nejlepší autor a máš obrovský dar vysvětlovat tak, že to pochopí i tupci jako jsem já. A že by stálo za to přepsat i druhou půlku seriálů o databázích v PHP, s Mircosoftem jsem to vzdala někde ve 12.tém dílu tuším, což mě velice mrzí, ale bohužel jsem se v těch jeho kódech přestala orientovat. Ale snažila jsem se hodně dlouho a dokonce se mi podařilo dát dohromady anketu, to další už ale bylo nad moje síly. Ráda bych se k tomu ale někdy vrátila, ovšem jen pokud to přepíšeš ty. Snad o tom budeš aspoň uvažovat. Ještě jednou díky.

 
Odpovědět 2.10.2015 1:17
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Bebbana
David Čápka:25.11.2015 16:14

Ahoj, moc díky za komentář :) Co se týká té druhé části, tak není úplně potřebná, klidně můžeš začít s OOP, jsou tam podobné věci (nějaké počítadlo a komentáře).

Odpovědět 25.11.2015 16:14
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Jan Grunt
Člen
Avatar
Jan Grunt:2.11.2016 13:36

Zdarvím :) Proč mi stále zlobí require_once? Obdobně i require_dirname etc.. Po zpracování mám:

Fatal error: require(): Failed opening required '.' (include_path='C:\xam­pp\php\PEAR') in C:\xampp\htdoc­s\index.php on line 2

Díky

 
Odpovědět 2.11.2016 13:36
Avatar
Jan Grunt
Člen
Avatar
Odpovídá na Jan Grunt
Jan Grunt:2.11.2016 14:26

již ok...:)

 
Odpovědět 2.11.2016 14:26
Avatar
Václav Podubecký:29. března 0:34

Super, díky tomuhle se objekty nezdají tak děsivé, je to jen jiný přístup, ale už si nemyslím, že složitější, díky za super seriál! :)

Odpovědět 29. března 0:34
Cesta k poznání je sama o sobě cílem.
Avatar
Dávid Vajda
Člen
Avatar
Dávid Vajda:18. dubna 19:28

Zdravím mám problém ako vyššie spomínal Jan aj keď si stiahnem súbory tak mi výstup píše:
Warning: Unknown: failed to open stream: No such file or directory in Unknown on line 0

Fatal error: Unknown: Failed opening required 'C:/xampp2/htdoc­s/prvéOOP/index­.php' (include_path='C:\xam­pp2\php\PEAR') in Unknown on line 0
Poradí niekto? :-)

 
Odpovědět 18. dubna 19:28
Avatar
SniCel
Člen
Avatar
SniCel:6. června 21:46

Caute. AJ ked odoberiem slovo public a necham funkciu bez slova ' public ' stale sa mi vypise Ahoj. Tak aky tam je rozdiel naozaj ?

 
Odpovědět  +1 6. června 21:46
Avatar
nasgol
Člen
Avatar
Odpovídá na SniCel
nasgol:24. září 20:47

To je dobra otazka...

Odpoved: "Methods declared without any explicit visibility keyword are defined as public."

PHP doc: http://php.net/…sibility.php

 
Odpovědět 24. září 20:47
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na SniCel
Jiří Gracík:24. září 22:35

Jak říká nasgol. Proto by se v php měla viditelnost deklarovat vždy.

Odpovědět 24. září 22:35
Creating websites is awesome till you see the result in another browser ...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 20. Zobrazit vše