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



Podobné dokumenty
Základy objektové orientace I. Únor 2010

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

1 Webový server, instalace PHP a MySQL 13

Návrh a tvorba WWW stránek 1/14. PHP a databáze

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

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

návrhový vzor Singleton.

Střední odborná škola a Střední odborné učiliště, Hořovice

typová konverze typová inference

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


MySQLi (objektově) Příklad vytvoření instance třídy včetně parametrů pro připojení: $mysqli = new mysqli('localhost', 'login', 'heslo', 'databaze');

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

Klíčová slova: dynamické internetové stránky, HTML, CSS, PHP, SQL, MySQL,

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Vstupní požadavky, doporučení a metodické pokyny

INOVACE PŘEDMĚTŮ ICT. MODUL 11: PROGRAMOVÁNÍ WEBOVÝCH APLIKLACÍ Metodika

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

1. Webový server, instalace PHP a MySQL 13

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

1. Dědičnost a polymorfismus

Aplikační vrstva. Úvod do Php. Ing. Martin Dostal

Programování v C++ 3, 3. cvičení

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

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

Střední odborná škola a Střední odborné učiliště, Hořovice

Úvodem 9. Zpětná vazba od čtenářů 10 Zdrojové kódy ke knize 10 Errata 10. Než začneme 11

Programování v C++ 2, 4. cvičení

Databázové aplikace pro internetové prostředí PHP úvod, základní princip, vkládání skriptu, komentáře, výpis na obrazovku

ANOTACE vytvořených/inovovaných materiálů

5. POČÍTAČOVÉ CVIČENÍ

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

InterSystems Caché Post-Relational Database

Obsah přednášky. Představení webu ASP.NET frameworky Relační databáze Objektově-relační mapování Entity framework

Pokročilé schopnosti OOP

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

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

4. lekce Přístup k databázi z vyššího programovacího jazyka

Objektové programování

8.2 Používání a tvorba databází

Architektura softwarových systémů

Generické programování

Databázové systémy Cvičení 5.2

17. července :51 z moravec@yahoo.com

Jazyk C# (seminář 5)

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

Sada 1 - PHP. 14. Úvod do jazyka SQL

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

Kurz je rozdělen do čtyř bloků, které je možné absolvovat i samostatně. Podmínkou pro vstup do kurzu je znalost problematiky kurzů předešlých.

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

KTE / ZPE Informační technologie

Databáze I. Přednáška 7

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

Programování v jazyce JavaScript

Instalace a konfigurace web serveru. WA1 Martin Klíma

OOP prostřednictvím návrhových vzorů

Programování v C++ 1, 5. cvičení

Programování II. Třídy a objekty (objektová orientovanost) 2018/19

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

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové aplikace

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

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

Dalším příkladem může být například výstup dat na různá zařízení, souborů, grafických rozhraní, sítě atd.

Skripta ke školení. Základy VBA. vypracoval: Tomáš Herout. tel:

VZOROVÝ STIPENDIJNÍ TEST Z INFORMAČNÍCH TECHNOLOGIÍ

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

Instalace. Produkt je odzkoušen pro MS SQL server 2008 a Windows XP a Windows 7. Pro jiné verze SQL server a Windows nebyl testován.

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

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

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

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

JavaScript 101. "Trocha života do statických stránek"

Dědičnost. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 23.března

Abstraktní třída a rozhraní

Uložené procedury Úvod ulehčit správu zabezpečení rychleji

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.

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

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

IB111 Programování a algoritmizace. Programovací jazyky

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

PHP framework Nette. Kapitola Úvod. 1.2 Architektura Nette

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Úvod do programovacích jazyků (Java)

Skriptovací jazyky. Obsah

Dědičnost. seskupování tříd do hierarchie. potomek získá všechny vlastnosti a metody. provádí se pomocí dvojtečky za názvem třídy.

HTTP. Webový server. generátor HTML stránek (CGI, Perl, PHP, Python, Ruby, Java, ASP.NET) zpracování požadavku/ odeslání odpovědi.

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

20. Projekt Domácí mediotéka

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Vyřešené teoretické otázky do OOP ( )

Střední odborná škola a Střední odborné učiliště, Hořovice

PB161 Základy OOP. Tomáš Brukner

PRŮBĚHOVÝ TEST Z PŘEDNÁŠEK

3. Třídy. Základní pojmy objektového programování. Třídy

Plánování a vývoj základního frameworku

Informační systémy 2008/2009. Radim Farana. Obsah. Dotazy přes více tabulek

Programování v jazyce JavaScript

Dědění, polymorfismus

PHP. Čtvrtek 8. září. Čtvrtek 15. září. Anonymní test znalostí

Transkript:

Page 1 of 6 Knihovna PHP Využití OOP v praxi Po dlouhé teorii přichází na řadu praxe. V následujícím textu si vysvětlíme možnosti přístupu k databázi pomocí různých vzorů objektově orientovaného programování v PHP. Představme si například internetový obchod, který pracuje s MySQL. Běžný e-shop může mít i několik desítek tisíc řádků kódu. Pokud se změní syntaxe jazyka nebo budete chtít změnit typ databáze, znamená to, že musíte projít všechny řádky kódu a zápis změnit. S OOP tento problém vyřešíte během několika málo minut. Funkce pracující se syntaxí SQL totiž nejsou součástí procedurálního uspořádání kódu, jsou vázány v objektech, a tak změna jednoho zápisu ovlivní chování celého kódu, který tuto třídu využívá. Zadání Naším cílem bude vytvořit kód rozhraní, které umožní komunikaci s databází MySQL i SQLite (případně dalších) s tím, že výběr typu databáze umožníme pouhou změnou jedné hodnoty proměnné. Při tvorbě aplikace využijeme abstraktní třídu, implementace rozhraní, dereference objektů a podobně. Přípravy Nejprve je třeba vytvořit databáze v SQLite i MySQL, vytvořit tabulky a databázi naplnit daty. Stáhněte si proto pomocný skript, který za vás vytvoří stejnou tabulku v MySQL i SQLite a naplní ji 150 náhodnými záznamy (v phpmyadmin je třeba vytvořit databázi "oop"). Vytvoření proměnných a vzoru Factory Nejprve si vytvoříme několik proměnných, které budou obsahovat informace o připojení a typ databáze. Pak pomocí vzoru factory zavoláme různou třídu podle hodnoty proměnné $type: $typ = 'SQLite'; $host = 'localhost'; $uzivatel = ''; $heslo = ''; $databaze = 'oop'; function Factory($typ,$host,$uzivatel,$heslo,$databaze){ if($typ == 'MySQL'){ return new MySQL($host,$uzivatel,$heslo,$databaze); else if($typ == 'SQLite'){ return new SQLite($databaze); else{ return FALSE;

Page 2 of 6 Třídě MySQL předáváme čtyři proměnné, třídě SQLite je třeba předat pouze název databáze. Definice tříd MySQL a SQLite a rozhraní Pro obě třídy MySQL a SQLite vytváříme stejnou strukturu, vytvoříme si tedy rozhraní, které obě třídy implementují. Funkce obou tříd je vytvoření spojení s příslušnou databází a volání další třídy, která provádí hlavní logiku operací: interface Spojeni{ public function spojeni(); public function dotaz($dotaz); class MySQL implements Spojeni{ protected $host; protected $uzivatel; protected $heslo; protected $databaze; protected $spoj; public function construct($host,$uzivatel,$heslo,$databaze){ $this->host = $host; $this->uzivatel = $uzivatel; $this->heslo = $heslo; $this->databaze = $databaze; public function spojeni(){ @$this->spoj = mysql_connect($this->host,$this->uzivatel,$this->heslo) or die('spojení se nezdařilo'); @mysql_select_db($this->databaze, $this->spoj) or die('databáze neexistuje'); public function dotaz($dotaz){ if(!$this->spoj){ $this->spojeni(); return new VraceniDotazuMySQL($this->spoj,$dotaz); class SQLite implements Spojeni{ public $databaze; public $spoj; public function construct($databaze){ $this->databaze = $databaze; public function spojeni(){ $this->spoj = sqlite_open($this->databaze) or die('spojení se nezdařilo'); public function dotaz($dotaz){ if(!$this->spoj){

Page 3 of 6 $this->spojeni(); return new VraceniDotazuSQLite($this->spoj,$dotaz); Definice tříd VraceniDotazuMySQL a VraceniDotazuSQLite a abstraktní třídy Nejprve vytvoříme abstraktní třídu. Proč nevytváříme rozhraní? Obsahuje totiž jednu metodu, která bude ve všech třídách stejná, a tak je jednodušší tuto metodu definovat jako abstraktní. Připomínám, že abstraktní třída se neimplementuje, ale dědí (nemůže sama vytvářet instance). abstract class VraceniDotazu{ abstract public function Vlozeni(); abstract public function VratPole(); public function Pole(){ $pole = array(); while ($radek = $this->vratpole()){ $pole[] = $radek; return $pole; Dále vytváříme třídy VraceniDotazuMySQL a VraceniDotazuSQLite. Konstruktor přiřazuje hodnoty předaným vlastnostem. Metoda Vlozeni() nejprve vytváří pole z argumentů, které metodě byly přiřazeny. Pak pomocí cyklu foreach připravíme dotaz pro databázi. Metoda VratPole() už následně vytváří pole hodnot, které jsme získali z databáze. K syntaxi dotazů se ještě později vrátíme. class VraceniDotazuMySQL extends VraceniDotazu{ protected $spojeni; protected $dotaz; protected $argumenty; protected $vysledek; public function construct($spojeni, $dotaz){ $this->spojeni = $spojeni; $this->dotaz = $dotaz; public function Vlozeni(){ $argumenty = func_get_args(); foreach ($argumenty as $index => $hodnota){ $this->argumenty[$index + 1] = $hodnota; $pocet_argumentu = count($argumenty); $dotaz = $this->dotaz; foreach($this->argumenty as $index => $hodnota){ $dotaz = str_replace(":$index","'".mysql_escape_string($hodnota)."'", $dotaz);

Page 4 of 6 $this->vysledek = mysql_query($dotaz); if(!$this->vysledek){ return FALSE; return $this; public function VratPole(){ return mysql_fetch_array($this->vysledek); class VraceniDotazuSQLite extends VraceniDotazu{ protected $spojeni; protected $dotaz; protected $argumenty; protected $vysledek; public function construct($spojeni, $dotaz){ $this->spojeni = $spojeni; $this->dotaz = $dotaz; public function Vlozeni(){ $argumenty = func_get_args(); foreach ($argumenty as $index => $hodnota){ $this->argumenty[$index + 1] = $hodnota; $pocet_argumentu = count($argumenty); $dotaz = $this->dotaz; foreach($this->argumenty as $index => $hodnota){ $dotaz = str_replace(":$index","'".sqlite_escape_string ($hodnota)."'", $dotaz); $this->vysledek = sqlite_query($this->spojeni, $dotaz); if(!$this->vysledek){ return FALSE; return $this; public function VratPole(){ return sqlite_fetch_array($this->vysledek); Dotazy na databázi Když máme rozhraní připravené, můžeme zadávat dotazy a výsledky vypisovat: $dotaz = "SELECT * FROM tab WHERE jmeno = :1"; $ins = Factory($typ,$host,$uzivatel,$heslo,$databaze); $jm = "jmeno".rand(1,10)."jmeno";

Page 5 of 6 $d = $ins->dotaz($dotaz)->vlozeni($jm)->pole(); echo '<table>'; for($i = 0; $i < count($d);$i++){ echo '<tr><td>'.$d[$i][id].'</td> <td>'.$d[$i][jmeno].'</td> <td>'.$d[$i][prijmeni].'</td></tr>'; echo '</table>'; Proč mají dotazy syntaxi SELECT * FROM tab WHERE jmeno = :1? Takový dotaz stačí použít jednou a pak už jen měníme argumenty, tedy další dotazy by například mohly vypadat takto: $d = $ins->dotaz($dotaz)->vlozeni('nějaké jméno')->pole(); Jelikož metoda Vlozeni() umožňuje přeměnu libovolného počtu předaných argumentů, můžeme používat dotazy typu: $dotaz = "SELECT * FROM tab WHERE jmeno = :1 AND prijmeni = :2"; $d = $ins->dotaz($dotaz)->vlozeni('nějaké jméno','nějaké prijmeni')->pole(); Díky takovému zápisu rovněž můžeme dotazy přizpůsobovat libovolnému typu databáze. Pro další studium a testování si stáhněte podklady k příkladu. Pozn. red.: Zdůrazňujeme, že tento text se týká PHP 5. zpracoval: Mrozek, Jakub (5. 9. 2007) Komentáře k článku Od: Drath IP: 89.235.29.155 Datum: 2007-12-27 10:32:16 Díky za článek, ale moc ho nechápu. S OOP jsem začal teprve nedávno a např. abstraktním třídám vůbec nerozumím. Nevíte o nějaké publikaci, kde by bylo OOP do podrobna, avšak pro laika srozumitelně, vše vysvětleno? Na jednu jsem narazil, ale příklady v ní byly v jazyku java(script) a C, raději bych příklady přímo v PHP. Od: Marek IP: 91.127.115.13 Datum: 2008-02-01 14:05:55 no co sa tyka abstraktnych tried zjednodusene povedane Ti sluzia na to aby si vedel nastavit nejake vlastnosti, vars a pod pre vsetky triedy ktore dedia abstraktnu, z abstraktnej triedy nemozes vytvorit instanciu. Ale to je len velmi jednoducho povedane

Page 6 of 6 Od: Gisat IP: 82.100.14.181 Datum: 2008-08-28 23:57:28 docela dobře je popsaná pokročilá práce v knížce pokročilé programování v php5 Od: Mastodont IP: 85.132.169.34 Datum: 2008-09-11 22:00:30 $d = $ins->dotaz($dotaz)->vlozeni($jm)-&g Hm, a co když Vlozeni vrátí false, jak se s tím kód vypořádá? Od: Mastodont IP: 85.132.169.34 Datum: 2008-09-11 22:09:03 No a pak bych se třeba ještě zeptal, proč tento kód: foreach ($argumenty as $index => $hodnota){ $this->argumenty[$index + 1] = $hodnota; když s $argumenty se pracuje jen v rámci metody Vlozeni, takže je není nutné ukládat do vlastnosti. Přidejte svůj názor! Zoner software, s.r.o., všechna práva vyhrazena, tento server dodržuje právní předpisy o ochraně osobních údajů.. ISSN 1212-8651.