Pokročilé schopnosti OOP



Podobné dokumenty
20. Projekt Domácí mediotéka

Principy objektově orientovaného programování

Úvod do databázových systémů

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

PREPROCESOR POKRAČOVÁNÍ

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

Teoretické minimum z PJV

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Projekty pro výuku programování v jazyce Java

Kolekce ArrayList. Deklarace proměnných. Import. Vytvoření prázdné kolekce. napsal Pajclín

Objektově orientované programování

typová konverze typová inference

Jazyk C# (seminář 3)

Algoritmus Minimax. Tomáš Kühr. Projektový seminář 1

1. Dědičnost a polymorfismus

Abstraktní třída a rozhraní

Úvod do PHP s přihlédnutím k MySQL

KAPITOLA 1 SOCIÁLNÍ SÍTĚ A PHP...17

návrhový vzor Singleton.

Objektové programování

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

10. blok Logický návrh databáze

Zobrazování dat pomocí tabulek

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

Příklady pracovních postupů

Mobilní aplikace Novell Filr Stručný úvod

Databázové systémy trocha teorie

Metodika. Architecture First. Rudolf Pecinovský

Semestrální práce implementuje univerzální tokenizer založený na stavovém automatu. Jsou implementovány následující automaty:

KTE / ZPE Informační technologie

Formuláře. Internetové publikování

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Člověk a příroda Biologie člověka Stavba a funkce lidského těla, 8.ročník. Žák si prohlubuje a získává informace o umělém přerušení těhotenství.


Objektově orientované programování v PHP 5. Martin Klíma

OBJECT DEFINITION LANGUAGE. Jonáš Klimeš NDBI001 Dotazovací Jazyky I 2013

5 Rekurze a zásobník. Rekurzivní volání metody

Ovladač Fiery Driver pro systém Mac OS

Výčtový typ strana 67

11. Dědičnost. Dědičnost strana 103

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

Tvorba geometrického modelu a modelové sítě.

Technologie počítačových sítí 5. cvičení

základy finančního práva

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

4. Základy relačních databází, logická úroveň návrhu

NPRG031 Programování II 1 / :25:46

NMIN201 Objektově orientované programování 1 / :36:09

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Objekty a třídy. Procedurální a objektově orientované programování. V této kapitole se naučíte: Procedurální a objektově orientované programování

Obecné pokyny k operativní činnosti kolegií

Program pro flexibilní tvorbu evidencí. VIKLAN - Evidence. Uživatelská příručka. pro seznámení se základními možnostmi programu

PRG036 Technologie XML

Správa linuxového serveru: Webová rozhraní k poště (Squirrelmail a Roundcube)

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

KAPITOLA 3. Architektura aplikací na frameworku Rails. V této kapitole: modely, pohledy, řadiče.

Diagramy tříd - základy

Agenda. Docházka Návrat k minulému praktickému cvičení Zápočtové práce. Dokumentace. Dotazy, přání, stížnosti. Co, jak a proč dokumentovat

Unity a Objekty (NMIN102) RNDr. Michal Žemlička, Ph.D.

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Programování v C++ První kroky

Kód, který se nebude často měnit

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Metodika pro vnitřní evaluaci Individuálních projektů systémových (IPs) podpořených z Prioritní osy 3

Objekty a OOP KAPITOLA 3. První kroky s OOP. V této kapitole: První kroky s OOP. Rozšiřujeme třídy Šablony Soubory projektu

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Úvod do programování - Java. Cvičení č.4

IRAE 07/08 Přednáška č. 1

Řízení SW projektů. Lekce 1 Základní pojmy a jejich vztahy. přednáška pro studenty FJFI ČVUT. zimní semestr 2012

VYTVÁŘENÍ OBSAHU KURZŮ

Webové služby. Martin Sochor

7.3 Diagramy tříd - základy

MEZINÁRODNÍ AUDITORSKÝ STANDARD ISA 705

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

Programování v Javě I. Leden 2008

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Jazyk C# a platforma.net

Obrázek 6.14: Prohlížec nápovedy

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Úvod - problém. Při přidání nového modelu je nutné upravit. Kód, který se nebu de často měnit. n Mějme obchod s auty:

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

Minebot manuál (v 1.2)

7.3 Diagramy tříd - základy

PŘIJETÍ K HOSPITALIZACI

Problém identity instancí asociačních tříd

VEŘEJNÁ JEDNOKOLOVÁ ARCHITEKTONICKO VÝTVARNÁ SOUTĚŽ O NÁVRH NA ŘEŠENÍ INTERIÉRŮ SCIENCE CENTRA A PLANETÁRIA

PB přednáška (26. října 2015)

Komponenty v.net. Obsah přednášky

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Rezervační systém Tvorba WWW stránek

PL/SQL. Jazyk SQL je jazykem deklarativním, který neobsahuje procedurální příkazy jako jsou cykly, podmínky, procedury, funkce, atd.

Programování v jazyce C a C++

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

ÚŘAD PRO OCHRANU HOSPODÁŘSKÉ SOUTĚŽE

Polymorfismus. Porovnání jazyků z hlediska polymorfismu Jazyky C, C++, C# Jazyk Java PHP a jiné Na závěr souhrn vlastností jednotlivých jazyků

ČÁST E OPERACE PROVÁDĚNÉ V REJSTŘÍKU ODDÍL 2 KONVERZE

SEMINÁŘE DEKSOFT 2015 Energetický audit (EA) vs. Energetický management (EM) Prezentace: Martin Varga

Transkript:

Kapitola 7 Pokročilé schopnosti OOP V kapitole 6 jste absolvovali základy objektově orientovaného programování v PHP. V této kapitole budeme na těchto základech stavět. Seznámíte se s několika vyspělejšími schopnostmi OOP, které byste si měli zařadit do svého repertoáru hned poté, co budete mít v malíku základy. Konkrétně se v kapitole hovoří o pěti schopnostech: Klonování objektů. Jedním z hlavních zdokonalení modelu OOP v PHP verze 5 je to, že se všechny objekty považují za odkazy, ne za hodnoty. Jak se pak ovšem vypořádáme s úlohou vytvořit kopii objektu, když se všechny objekty považují za odkazy? Klonováním objektu, což je nová schopnost v PHP 5. Dědění. Jak už bylo zmíněno v kapitole 6, je schopnost budovat hierarchie tříd prostřednictvím dědění klíčovým pojmem OOP. Dozvíte se, co je to dědění, jakou má v PHP 5 syntax, a uvidíte několik příkladů, které předvádějí tuto klíčovou schopnost OOP. Rozhraní. Rozhraní je nějaká kolekce neimplementovaných definic metod a konstant. Slouží jako jistý náčrt třídy. Rozhraní přesně definují, co se může ve třídě dělat, ale nezatěžují se konkrétními podrobnostmi implementace. V této kapitole se dozvíte, jakou podporu poskytuje PHP 5 pro rozhraní, a uvidíte také několik příkladů, které předvádějí tuto klíčovou schopnost OOP. Abstraktní třídy. Abstraktní třída je v podstatě taková třída, ze které se nedají vytvářet instance. Účelem abstraktních tříd je to, aby se z nich odvozovaly třídy, jejichž instance se už dají vytvářet (říká se jim někdy konkrétní třídy). Abstraktní třídy lze implementovat plně, nebo implementovat jen částečně, nebo neimplementovat vůbec. V této kapitole se uvádějí všeobecné pojmy, které se točí okolo abstraktních tříd spolu s úvodem, jak se abstraktní třídy implementují v PHP 5. Reflexe. Jak jste se dozvěděli v kapitole 6, skrývání odpudivých podrobností aplikace přívětivými rozhraními ( zapouzdření) je jedním z hlavních pilířů OOP. Nicméně programátoři ovšem potřebují nějaké pohodlné prostředky, jimiž se dá prozkoumávat chování třídy. Tuto schopnost poskytuje pojem reflexe, který se zde vysvětluje.

178 Kapitola 7 Pokročilé vlastnosti OOP Schopnosti OOP nepodporované v PHP Máte-li zkušenosti s jinými objektově orientovanými jazyky, možná po přečtení výše uvedeného seznamu nespokojeně potřásáte hlavou, a ptáte se, proč v něm chybí jedna nebo několik konkrétních schopností OOP, které důvěrně znáte z jiných jazyků. Je docela dobře možné, že je to kvůli tomu, že PHP tuto schopnost nepodporuje. Takže abyste si hlavu úplně nevyviklali z pantů, jsou v následujícím výčtu uvedena ta vyspělá témata OOP, která PHP nepodporuje, a proto jejich výklad v kapitole nenajdete. Jmenné prostory ( namespace). Přestože byly původně do PHP 5 naplánované, od začlenění jmenných prostorů bylo brzo upuštěno. Není jasné, zda bude podpora jmenných prostorů integrována do nějaké budoucí verze. Přetěžování metod ( overloading). Možnost docílit polymorfického účinku prostřednictvím přetěžování funkcí PHP nepodporuje a podle diskuse na webových stránkách Zend Technologies, patrně ani nikdy podporovat nebude. Více se o tom můžete dozvědět na adrese http://www. zend.com/php/ask_experts.php. Přetěžování operátorů. Možnost přiřadit dodatečné významy stávajícím operátorům na základě typu dat, která se pokoušíte modifikovat, zatím není na pořadu dne. Podle výše zmíněné diskuse na webu Zend Technologies, není pravděpodobné, že by se tato schopnost někdy v budoucnu implementovala. Vícenásobné dědění. PHP nepodporuje vícenásobné dědění. Implementace více rozhraní se však podporuje. Jen čas ukáže, budou-li se v budoucnu některé z těchto schopností v PHP podporovat. Klonování objektů Jednou z největších stinných stránek objektově orientovaných schopností PHP 4 byla skutečnost, že zacházel s objekty jako s jinými datovými typy. Tato praxe byla překážkou využití mnohých běžných metodologií OOP, jako jsou návrhové vzory. Takové metodologie závisejí na možnosti předávat objekty do jiných metod třídy odkazem, ne hodnotou, což byla výchozí praktika v PHP. Naštěstí byla tato záležitost v PHP 5 vyřešena, a nyní se standardně se všemi objekty zachází jako s odkazy. Protože se ale nyní se všemi objekty zachází jako s odkazy, ne jako s hodnotami, je zase obtížnější udělat kopii objektu. Pokusíte-li se zkopírovat odkazovaný objekt, bude prostě ukazovat zpět na adresované umístění původního objektu. PHP se s tím vypořádal tak, že nabízí explicitní prostředek pro klonování objektu. Příklad klonování Klon objektu vytvoříte tak, že před ním uvedete klíčové slovo clone, jako zde: cílový_objekt = clone zdrojový_objekt; Vyčerpávající příklad klonování objektu nabízí výpis 7-1. V příkladu jsem vytvořil ukázkovou třídu s názvem parazitfirmy, která obsahuje dva členy (idzamestnance a barvakravaty), a jejich odpovídající gettery a settery. V příkladu se vytvoří instance parazitfirmy a použije se jako základna pro předvedení, jaké účinky má operace klonování.

Velká kniha PHP a MySQL 5 179 Výpis 7-1. Klonování objektu pomocí klíčového slova clone <?php class parazitfirmy { private $idzamestnance ; private $barvakravaty; // Definuje setter a getter pro $idzamestnance function nastavitidzamestnance ($idzamestnance ) { $this->idzamestnance = $idzamestnance ; function ziskatidzamestnance() { return $this->idzamestnance ; // Definuje setter a getter pro $barvakravaty function nastavitbarvukravaty ($barvakravaty) { $this->barvakravaty = $barvakravaty; function ziskatbarvukravaty() { return $this->barvakravaty; // Vytvoří nový objekt parazita firmy $parazit1 = new parazitfirmy(); // Nastaví člen idzamestnance parazita 1 $parazit1->nastavitidzamestnance ("12345"); // Nastaví člen barvakravaty parazita 1 $parazit1->nastavitbarvukravaty ("červená"); // Vytvoří klon parazita 1 $parazit2 = clone $parazit1; // Nastaví člen idzamestnance parazita 2 $parazit2->nastavitidzamestnance ("67890");?> // Výstup členů prvního a druhého parazita echo "parazit1 id zaměstnance: ".$parazit1->ziskatidzamestnance ()."<br />"; echo "parazit1 barva kravaty: ".$parazit1->ziskatbarvukravaty()."<br />"; echo "parazit2 id zaměstnance: ".$parazit2->ziskatidzamestnance ()."<br />"; echo "parazit2 barva kravaty: ".$parazit2->ziskatbarvukravaty()."<br />";

180 Kapitola 7 Pokročilé vlastnosti OOP Když kód spustíte, vrátí: parazit1 id zaměstnance: 12345 parazit1 barva kravaty: červená parazit2 id zaměstnance: 67890 parazit2 barva kravaty: červená Jak vidíte, $parazit2 se stal objektem typu parazitfirmy a zdědil hodnoty členů z $parazit1. Aby se zdůraznilo, že je $parazit2 opravdu typu parazitfirmy, nastavil se znovu i jeho člen idzamestnan- ce. Metoda clone() Při klonování objektu si dokonce můžete přizpůsobit chování tohoto procesu, když si ve třídě objektu definujete metodu clone(). Kromě toho, že se do cílového objektu zkopírují všechny existující členy objektu, vykoná se také vše, co je umístěné v této metodě. Upravte třídu parazitfirmy tak, že do ní přidáte metodu: function clone() { $this->barvakravaty = "modrá"; Až s tím budete hotovi, vytvořte nový objekt parazitfirmy, přidejte hodnotu členu idzamestnance, udělejte klon objektu, a nakonec vypište potřebná data, abyste si ověřili, že se barvakravaty klonovaného objektu skutečně nastavila prostřednictvím metody clone(). Příklad vidíte ve výpisu 7-2. Výpis 7-2. Rozšíření možností klíčového slova clone metodou clone() // Vytvoří objekt nového parazita firmy $parazit1 = new parazitfirmy(); // Nastaví člen idzamestnance parazita 1 $parazit1->nastavitidzamestnance ("12345"); // Vytvoří klon objektu $parazit1 $parazit2 = clone $parazit1; // Nastaví člen idzamestnance parazita 2 $parazit2->nastavitidzamestnance ("67890"); // Výstup členů obou parazitů echo "parazit1 id zaměstnance: ".$parazit1->ziskatidzamestnance ()."<br />"; echo "parazit2 id zaměstnance: ".$parazit2->ziskatidzamestnance ()."<br />"; echo "parazit2 barva kravaty: ".$parazit2->ziskatbarvukravaty()."<br />"; Když kód vykonáte, vypíše: parazit1 id zaměstnance: 12345 parazit2 id zaměstnance: 67890 parazit2 barva kravaty: modrá

Dědění Velká kniha PHP a MySQL 5 181 Lidé mají docela dobrou výbavu pro uvažování v takových termínech, jakým je třeba uspořádaná hierarchie, proto není nijak překvapující, že je takové nahlížení na správu mnoha aspektů našeho každodenního života široce rozšířené. Struktury managementu firmy, daňový systém Spojených Států, i náš pohled na říše rostlin a živočichů, to je jen několik příkladů systémů, které se převážně spoléhají na hierarchie. Protože je objektově orientované programování založeno na premise, že my lidé dokážeme velmi dobře modelovat vlastnosti a chování prostředí skutečného světa, které se snažíme implementovat pomocí kódu, dá se z toho rozumně usoudit, že jsme také schopni znázorňovat tyto hierarchické vztahy. Předpokládejme například, že vaše aplikace potřebuje třídu nazvanou Zamestnanec, jejíž účelem má být reprezentace charakteristik a chování, jaká člověk může očekávat od nějakého zaměstnance. Mezi členy takové třídy by mohly patřit jmeno: jméno zaměstnance vek: věk zaměstnance plat: plat zaměstnance zamestnan_let: počet let, které daný zaměstnanec u firmy pracuje. Mezi metody třídy Zamestnanec by mohly patřit: vykonatpraci: vykoná nějakou práci související se zadaným úkolem. snistobed: vezme si přestávku na oběd. vzitdovolenou: týká se nejcennějších týdnů v roce. Tyto charakteristiky a chování budou relevantní pro všechny druhy zaměstnanců, bez ohledu na účel nebo pozici zaměstnance v organizaci. Je zřejmé, že budou mezi zaměstnanci také jisté rozdíly; například, pracovník exekutivy může mít v držení jisté akcie firmy, a bude sto společnost tunelovat, zatímco jiní zaměstnanci takové výdobytky nemají. Sekretářka musí umět napsat dopis a vedoucí prodejny musí umět udělat inventuru. Navzdory těmto rozdílům by ale bylo velmi neefektivní, kdybyste museli vytvářet a udržovat redundantní struktury tříd pro ty atributy, které sdílejí všichni zaměstnanci. Vývoj schematu OOP to bere v úvahu. Umožňuje dědit z existujících tříd a dále na nich budovat. Dědění třídy V PHP se dědění třídy dociluje klíčovým slovem extends.předvádí je výpis 7-3, kde se nejprve definuje třída Zamestnanec, pak se vytvoří třída Vedouci, která bude dědit ze třídy Zamestnanec. Poznámka Třídě, která dědí z jiné třídy, se říká dceřiná ( child) třída, podtřída nebo odvozená třída. Dceřiná třída dědí ze své rodičovské (parent), neboli základní ( base) třídy.

182 Kapitola 7 Pokročilé vlastnosti OOP Výpis 7-3. Dědění ze základní třídy <?php # Definuje třídu Zamestnanec class Zamestnanec { private $jmeno; # Definuje funkci set vlastnosti pro soukromý člen $jmeno. function nastavitjmeno($jmeno) { if ($jmeno == "") echo "Jméno nesmí zůstat prázdné!"; else $this->jmeno = $jmeno; # Definuje funkci get vlastnosti pro soukromý člen $jmeno function ziskatjmeno() { return "Jmenuji se ".$this->jmeno."<br />"; #konec třídy Zamestnanec # Definuje třídu Vedouci, která bude dědit z třídy Zamestnanec class Vedouci extends Zamestnanec { # Definuje metodu jedinečnou pro Zamestnanec function tunelovatfirmu() { echo "Prodám aktiva firmy, abych mohl financovat svou jachtu!"; #konec třídy Vedouci # vytvoří nový objekt Vedouci $exec = new Vedouci(); # zavolá metodu nastavitjmeno(), která je definovaná ve třídě Zamestnanec $exec->nastavitjmeno("richard"); # Zavolá metodu ziskatjmeno() echo $exec->ziskatjmeno();?> # zavolá metodu tunelovatfirmu() $exec->tunelovatfirmu(); Kód vrátí Jmenuji se Richard. Prodám aktiva firmy, abych mohl financovat svou jachtu!