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

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

V minulém dílu našeho seriálu tutoriálů o objektově orientovaném programování v PHP jsme si vysvětlili proč OOP vzniklo a nakousli jak OOP vypadá. Dnes 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:

Ahoj

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ý. Příště se zaměříme na atributy objektů a tzv. magické metody.


 

Stáhnout

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

 

  Aktivity (2)

Článek pro vás napsal David Čápka
Avatar
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.

Jak se ti líbí článek?
Celkem (29 hlasů) :
4.931044.931044.931044.931044.93104


 



 

 

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

Avatar
Kit
Redaktor
Avatar
Kit:

Není to zas tak hrozné. Vždyť každý programátor je jen člověk - a máme tu dědičnost:

class Programátor extends Člověk

:)
A Dan je instancí třídy Programátor. Umí vše, co umí Člověk (chodit, mluvit, jíst,...) a ještě něco navíc (Programovat)

A polymorfismus? Když řekneš člověku "spi", tak každý bude spát. Když mu ale řekneš "pracuj", tak programátor sedne k počítači, traktorista za volant a prodavačka si stoupne za pult. Přitom jsi všem dal stejný pokyn.

A teď už se to jen převede do programovacího jazyka.

Odpovědět  +13 2.8.2013 8:00
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Odpovídá na Kit
Daniel Vítek:

OK, tohle zas tak moc složitě nevypadá :D
Díky za vysvětlení ;)

 
Odpovědět 2.8.2013 8:07
Avatar
Amomym
Člen
Avatar
Amomym:

David Čápka né že bych tě chtěl hnat, ale kdy bude další pokračování?

 
Odpovědět  -4 2.8.2013 16:59
Avatar
matej
Neregistrovaný
Avatar
matej:

Tak tento serial o OOP je UZASNY! Pred pár dňami som si kupil knihu o OOP. Text je tam písaný absolútne odveci. Nič mi prečítanie tej knihy dokopy nedalo. Tieto články si zaslúžia fakt poklonu. Keby som vedel, radsej pošlem prachy sem aj s niekoľkými pivami, lebo si to fakt stojí za to. Len tak ďalej.

 
Odpovědět 29.8.2013 16:21
Avatar
Old Account
Člen
Avatar
Old Account:

Velmi pekny tutorial, urcite vyborny pre zaciatocnikov/mi­erne pokrocilych.

Odpovědět 25.11.2013 23:18
"If you keep your eye on the profit, you’re going to skimp on the product. But if you focus on making really gre...
Avatar
malevil
Člen
Avatar
malevil:

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

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

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:

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:

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. listopadu 13:36
Avatar
Jan Grunt
Člen
Avatar
 
Odpovědět 2. listopadu 14:26
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 15. Zobrazit vše