PHP 7
Praktický průvodce nejrozšířenějším skriptovacím jazykem pro web Nudné weby jsou statické. Zajímavé weby jsou dynamické. Pokud chcete začít pracovat s PHP, nejrozšířenějším skriptovacím jazykem pro web, tato kniha je určena právě vám. Její autor, David Sklar, vás provede všemi aspekty PHP, které jsou nezbytné k tomu, abyste mohli začít budovat dynamické webové stránky. Prozkoumáním funkcionalit a vylepšení obsažených v PHP 7 se dozvíte, jak například pracovat s webovými servery, databázemi a webovými službami. Na konci většiny kapitol pak naleznete praktická cvičení, která vám umožní otestovat si, jak moc dobře jste pochopili právě probíranou látku.
slevy, akce,
novinky
Ladění Testování: funguje váš program správně? Užitečné praktiky softwarového inženýrství Datum a čas Správa balíků Odesílání e-mailových zpráv Frameworky PHP na příkazovém řádku Internacionalizace a lokalizace Instalace a konfigurace PHP enginu Řešení ke cvičením v knize
© pixabay.com (2938551)
Kapitoly obsažené v knize: Orientace a první kroky Data: práce s textem a s čísly Logika: rozhodování a smyčky Seskupování dat: práce s poli Seskupování logiky: funkce a soubory Data a logika dohromady: práce s objekty Výměna informací: webové formuláře Uchovávání informací: databáze Práce se soubory Zapamatování uživatelů: cookie a relace Komunikace s jinými weby a se službami
Nechejte nám kontakt na novinky.zonerpress.cz a získáte další bonusy, slevy a jiné výhody.
DOPORUČENÁ CENA: 499 KČ KATALOGOVÉ ČÍSLO: ZRK1606
P R E S S
PHP 7
Praktický průvodce nejrozšířenějším skriptovacím jazykem pro web
David Sklar
David Sklar
Z O N E R
PHP 7
Praktický průvodce nejrozšířenějším skriptovacím jazykem pro web
E N C Y K L O P E D I E
ISBN 978-80-7413-363-3
Zoner Press tel.: 532 190 883 e-mail: knihy@zoner.cz www.zonerpress.cz ZONER software, a.s., Nové sady 18, 602 00 Brno
9 7 8 8 0 7 4 1 3 3 6 3 3
David Sklar
PHP 7 Praktický průvodce nejrozšířenějším skriptovacím jazykem pro web
David Sklar
LEARNING PHP David Sklar
© 2017 Zoner software, a.s. Authorized Czech translation of the English edition of Learning PHP ISBN 9781491933572 © 2016 David Sklar. This translation is published and sold by permission of O'Reilly Media, Inc., which owns or controls all rights to publish and sell the same. © 2017 Zoner software, a.s. Autorizovaný český překlad originálního anglického vydání Learning PHP ISBN 9781491933572 © 2016 David Sklar. Překlad je vydán a prodáván s výslovným povolením O'Reilly Media, Inc., který je vlastníkem veškerých práv na vydání i prodej tohoto titulu.
PHP 7 – Praktický průvodce nejrozšířenějším skriptovacím jazykem pro web Autor: David Sklar Copyright © ZONER software, a.s. Vydání první, v roce 2018. Všechna práva vyhrazena. Zoner Press Katalogové číslo: ZRK1606 ZONER software, a.s. Nové sady 18, 602 00 Brno Překlad: RNDr. Jan Pokorný Odpovědný redaktor: Miroslav Kučera Šéfredaktor: Ing. Pavel Kristián DTP: Miroslav Kučera Obálka: Mgr. Petr Bernát
Informace, které jsou v této knize zveřejněny, mohou byt chráněny jako patent. Jména produktů byla uvedena bez záruky jejich volného použití. Při tvorbě textů a vyobrazení bylo sice postupováno s maximální péčí, ale přesto nelze zcela vyloučit možnost výskytu chyb. Vydavatelé a autoři nepřebírají právní odpovědnost ani žádnou jinou záruku za použití chybných údajů a z toho vyplývající důsledky. Všechna práva vyhrazena. Žádná část této publikace nesmí být reprodukována ani distribuována žádným způsobem ani prostředkem, ani reprodukována v databázi či na jiném záznamovém prostředku či v jiném systému bez výslovného svolení vydavatele, s výjimkou zveřejnění krátkých částí textu pro potřeby recenzí. Tato publikace neprošla jazykovou úpravou. Veškeré dotazy týkající se distribuce směřujte na: Zoner Press ZONER software, a. s. Nové sady 18, 602 00 Brno tel.: 532 190 883 e-mail: knihy@zoner.cz www.zonerpress.cz Zdrojové soubory ke knize: http://soubory.zonerpress.cz/zrk1606
ISBN 978-80-7413-363-3
3
Stručný obsah Kapitola 1
Orientace a první kroky
15
Kapitola 2
Data: práce s textem a s čísly
31
Kapitola 3
Logika: rozhodování a smyčky
49
Kapitola 4
Seskupování dat: práce s poli
65
Kapitola 5
Seskupování logiky: funkce a soubory
87
Kapitola 6
Data a logika dohromady: práce s objekty
105
Kapitola 7
Výměna informací: webové formuláře
117
Kapitola 8
Uchovávání informací: databáze
151
Kapitola 9
Práce se soubory
181
Kapitola 10
Zapamatování uživatelů: cookie a relace
197
Kapitola 11
Komunikace s jinými weby a se službami
217
Kapitola 12
Ladění
233
Kapitola 13
Testování: funguje váš program správně?
247
Kapitola 14
Užitečné praktiky softwarového inženýrství
259
Kapitola 15
Datum a čas
265
Kapitola 16
Správa balíků
273
Kapitola 17
Odesílání e-mailových zpráv
277
Kapitola 18
Frameworky
281
Kapitola 19
PHP na příkazovém řádku
287
Kapitola 20
Internacionalizace a lokalizace
293
Dodatek A
Instalace a konfigurace PHP enginu
299
Dodatek B
Řešení ke cvičením v knize
307
4
Podrobný obsah Úvod
Kapitola 1
Kapitola 2
Kapitola 3
Kapitola 4
9
Orientace a první kroky
15
Místo PHP ve světě webu
15
Proč je PHP skvělé?
18
PHP v akci
19
Základní pravidla pro psaní PHP programů
25
Shrnutí kapitoly
29
Data: práce s textem a s čísly
31
Text
31
Čísla
40
Proměnné
42
Shrnutí kapitoly
46
Cvičení
47
Logika: rozhodování a smyčky
49
Hodnoty true a false
50
Rozhodování
51
Sestavování složitých rozhodnutí
53
Opakované vykonávání
59
Shrnutí kapitoly
61
Cvičení
62
Seskupování dat: práce s poli
65
Základy práce s poli
65
Procházení polí ve smyčce
69
Modifikování polí
75
Seřazení prvků pole
77
Vícerozměrná pole
81
Shrnutí kapitoly
84
Cvičení
85
5 Kapitola 5
Seskupování logiky: funkce a soubory
87
Deklarace a volání funkcí
88
Předávání argumentů do funkcí
89
Vracení hodnot z funkcí
92
Obor proměnných
96
Vynucování pravidel pro argumenty a návratové hodnoty
Kapitola 6
Kapitola 7
Kapitola 8
100
Spouštění kódu v jiném souboru
102
Shrnutí kapitoly
103
Cvičení
104
Data a logika dohromady: práce s objekty
105
Základy práce s objekty
106
Konstruktory
108
Indikace potíží s výjimkami
109
Odvozování podtříd
111
Viditelnost vlastností a metod
113
Jmenné prostory
114
Shrnutí kapitoly
116
Cvičení
116
Výměna informací: webové formuláře
117
Užitečné serverové proměnné
120
Přístup k parametrům formuláře
122
Zpracování formuláře funkcemi
124
Validace dat
126
Zobrazování výchozích hodnot
138
Dáme všechno dohromady
140
Shrnutí kapitoly
149
Cvičení
149
Uchovávání informací: databáze
151
Uspořádání dat v databázi
152
Připojení k databázovému programu
153
Vytvoření tabulky
155
Ukládání dat do databáze
157
6
Kapitola 9
Kapitola 10
Kapitola 11
Bezpečné vkládání dat formuláře
163
Kompletní formulář pro vkládání dat
164
Získávání dat z databáze
167
Změna formátu dodávaných řádků
171
Bezpečné získávání dat formuláře
172
Kompletní formulář pro získávání dat
175
Shrnutí kapitoly
179
Cvičení
180
Práce se soubory
181
Přístupová oprávnění k souboru
181
Čtení a zapisování celých souborů
182
Čtení a zapisování jen částí souborů
184
Práce se soubory CSV
187
Inspekce souborových oprávnění
189
Kontrola chyb
190
Ošetření externě dodaných názvů souborů
193
Shrnutí kapitoly
195
Cvičení
195
Zapamatování uživatelů: cookie a relace
197
Jak se pracuje s cookies
198
Aktivace relací
202
Ukládání a získávání informací
203
Konfigurace relací
206
Přihlašování a identifikace uživatele
208
Proč chtějí být setcookie() a session_start() na stránce úplně nahoře
214
Shrnutí kapitoly
215
Cvičení
216
Komunikace s jinými weby a se službami
217
Jednoduchý přístup k URL se souborovými funkcemi
217
Úplný přístup k URL s cURL
222
Obsluha API požadavků
228
Shrnutí kapitoly
231
Cvičení
232
7 Kapitola 12
Kapitola 13
Kapitola 14
Kapitola 15
Kapitola 16
Ladění
233
Kde se mají objevovat zprávy o chybách
233
Oprava chyb nalezených při rozboru
234
Inspekce dat programu
237
Ošetření nezachycených výjimek
243
Shrnutí kapitoly
244
Cvičení
245
Testování: funguje váš program správně?
247
Instalace PHPUnit
247
První unit test
248
Co testujete, izolujte
251
Vývoj řízený testy
254
Další informace o testování
256
Shrnutí kapitoly
256
Cvičení
257
Užitečné praktiky softwarového inženýrství
259
Řízení verzí
260
Sledování úloh
261
Různá prostředí a rozmisťování
261
Škálujte až nakonec
262
Shrnutí kapitoly
263
Datum a čas
265
Zobrazování data nebo času
265
Rozbor data nebo času
268
Výpočty s datem a s časem
270
Časová pásma
271
Shrnutí kapitoly
272
Správa balíků
273
Instalace Composeru
273
Jak se přidá nějaký balík do programu
273
Hledání balíků
275
8
Kapitola 17
Kapitola 18
Kapitola 19
Kapitola 20
Dodatek A
Dodatek B Rejstřík
Získání dalších informací o Composeru
275
Shrnutí kapitoly
276
Odesílání e-mailových zpráv
277
Swift Mailer
277
Shrnutí kapitoly
279
Frameworky
281
Laravel
282
Symfony
283
Zend Framework
284
Shrnutí kapitoly
286
PHP na příkazovém řádku
287
Psaní programů PHP pro příkazový řádek
287
Vestavěný webový server PHP
289
REPL v PHP
290
Shrnutí kapitoly
291
Internacionalizace a lokalizace
293
Manipulace s textem
294
Řazení a porovnávání
295
Lokalizace výstupu
296
Shrnutí kapitoly
298
Instalace a konfigurace PHP enginu
299
PHP u poskytovatele webového hostingu
299
Instalace PHP enginu
300
Změna konfiguračních direktiv PHP
301
Shrnutí dodatku
306
Řešení ke cvičením v knize
307 357
9
Úvod Nudné weby jsou statické. Zajímavé weby jsou dynamické – tj. jejich obsah se mění. S obří statickou HTML stránkou obsahující názvy, obrázky, popisy a ceny všech tisíců výrobků, které nabízí firma k prodeji, se pracuje obtížně, nehledě na to, že trvá věčnost, než se načte. Daleko prospěšnější je dynamický webový katalog produktů, v němž můžete vyhledávat a filtrovat produkty tak, že naráz vidíte jen šest, které vyhovují vašim kritériím z hlediska ceny a kategorie. Je to také rychlejší a je pravděpodobnější, že zákazník něco koupí. Programovací jazyk PHP umožňuje snadno vytvářet dynamické weby. Bez ohledu na to, co interaktivního chcete vytvořit, ať už to má být katalog produktů, blog, album fotografií nebo kalendář akcí, PHP je na každou takovou úlohu velmi dobře a dostatečně vybaven. A až dočtete tuto knihu, budete i vy dobře a dostatečně připravení pro budování dynamického webu.
Komu je kniha určena Tato kniha je vhodná pro různé skupiny lidí: Nadšence, kteří se chystají vytvořit interaktivní web pro sebe, pro svou rodinu, nebo pro nějakou ne-
ziskovou organizaci. Stavitele webů, kteří chtějí využít přípravu PHP, jakou poskytují ISP nebo poskytovatelé hostingu. Vývojáře nebo designéry, kteří potřebují napsat plugin nebo rozšíření pro nějaký populární software
běžící v PHP, jako jsou Drupal, WordPress nebo MediaWiki. Designéry stránek, kteří chtějí lépe komunikovat se svými spolupracovníky vývojáři. JavaScriptové profesionály, kteří chtějí vytvářet programy na straně serveru doplňující kód na straně
klienta. Programátory Perlu, Pythonu nebo Ruby, kteří se chtějí rychle seznámit s PHP. Kohokoli, kdo si chce přečíst přímočarý úvod oproštěný od žargonu do jednoho z nejoblíbenějších
programovacích jazyků určených pro budování interaktivních webů. PHP má dobrou křivku učení a přívětivou syntaxi. To z něho činí ideální vstupní bránu do programování pro webové profesionály s netechnickým vzděláním. Tato kniha o PHP 7 je určena nejen těm, kteří se o něj zajímají, jsou bystří, ale možná nemají odborné vzdělání tohoto druhu, ale i programátorům, kteří se dobře vyznají v nějakém jiném jazyku a chtějí se naučit PHP. Jestliže jste v programování úplnými nováčky a chtěli byste se pustit do svého prvního interaktivního webu, máte v rukách tu správnou knihu. Úvodní kapitoly poskytují vlídný úvod do syntaxe jazyka PHP a do základních témat počítačového programování tak, jak se aplikují v PHP. Jednoduše začněte knihu číst od úplného začátku a postupujte vpřed tempem, jaké vám vyhovuje. Jestliže už umíte programovat v nějakém jiném jazyku a začínáte pracovat na svém první projektu v PHP, můžete rovnou přejít do druhé části knihy a do první části se vracet jen tehdy, až vyvstane nějaká otázka ohledně syntaxe nebo když se budete chtít podívat, jak se v PHP udělá něco konkrétního. Kromě základní počítačové gramotnosti (tj. umět psát, přesouvat soubory a surfovat po webu) od vás budeme potřebovat jednu jedinou věc: vyznat se v HTML. Nemusíte být žádný expert, ale měli byste chápat, k čemu slouží značky, které se běžně vyskytují na webových stránkách – tedy například <html>, <head>, <body>, <p>, <a>, <br> a další. Pokud se v HTML nevyznáte, přijde vám vhod kniha HTML5 a CSS3 pro webové designéry z nakladatelství Zoner Press (www.zonerpress.cz/html5-a-css3-pro-webove-designery).
10
Co v knize najdete Kniha je navržena tak, abyste ji začali číst od začátku a četli kapitoly v pořadí, v jakém jsou v knize uvedeny. Téma probírané v dané kapitole totiž většinou vyžaduje pochopení látky probrané v předchozích kapitolách. Kapitoly 2 až 13 obsahují praktická cvičení, jimiž můžete otestovat, jak jste pochopili obsah dané kapitoly. Kapitola 1 poskytuje všeobecné základní informace o PHP, včetně toho, jak komunikuje s webovým prohlížečem a s webovým serverem. Také se zde ukazuje několik programů PHP, abyste si mohli udělat představu, jak vlastně programy napsané v PHP vypadají. Pokud teprve začínáte s programováním nebo s budováním dynamických webů, je velmi důležité, abyste si tuto kapitolu pečlivě přečetli. V dalších pěti kapitolách se pocvičíte v základních dovednostech spojených s programováním v PHP. Než můžete začít psát knižní romány, musíte něco vědět o gramatice a mít adekvátní slovní zásobu. A přesně tohle v těchto kapitolách dostanete. (Ničeho se ale neobávejte – naučíte se jen tolik gramatiky a slovní zásoby PHP, abyste mohli rovnou začít psát krátké prográmky, ne skvělé romány.) Kapitola 2 ukazuje, jak se pracuje s různými druhy dat, jako jsou texty a čísla. To je důležité, protože webové stránky, které jsou generovány programy PHP, vlastně nejsou ničím jiným, než velkými kusy textu. Kapitola 3 popisuje příkazy PHP, s nimiž mohou programy činit rozhodnutí. Tato rozhodnutí jsou duší "dynamiky" v dynamickém webu. Věci probírané v kapitole 3 ukazují, jak postupovat, když chcete například zobrazit pouze ty položky z nějakého katalogu výrobků, jejichž ceny spadají do cenového rozsahu, který specifikoval koncový uživatel prostřednictvím webového formuláře. Kapitola 4 je úvod do polí, což jsou kolekce jednotlivých čísel nebo textů. Pole se využívají při často vykonávaných činnostech v programech PHP, jako je zpracování parametrů odeslaného webového formuláře nebo zkoumání informací získaných z databáze. Až budete psát složitější programy, zjistíte, že jisté úlohy chcete opakovat. Opětovnému využívání částí programů pomáhají funkce probírané v kapitole 5. Kapitola 6 ukazuje, jak se data a logika kombinují dohromady do objektů. Objekty jsou opětovně využitelné části kódu, které pomáhají lépe strukturovat programy. Objekty také umožňují integrovat do kódu již existující doplňky a knihovny PHP. Dalších pět kapitol pokrývá úlohy, které tvoří podstatu vybudování dynamického webu: interakce s uživateli, uchovávání informací a interakce s jinými weby. Kapitola 7 obsahuje podrobnosti o práci s webovými formuláři, což je primární způsob, jakým budou uživatelé komunikovat s webem. V kapitole 8 se diskutuje o databázích. V databázi se uchovávají informace, které se zobrazují na webu, jako je katalog produktů nebo kalendář událostí. V této kapitole ukážeme, jak docílit toho, aby program PHP uměl komunikovat s databází. S technikami popsanými v kapitole 8 bude web schopen vykonávat specifické věci pro konkrétní uživatele, například zobrazit citlivé informace pouze autorizovaným lidem, nebo sdělit konkrétní osobě, kolik nových příspěvků přibylo na stránku od okamžiku, kdy byla naposledy přihlášena. Kromě databází možná budete potřebovat pracovat i s daty uloženými v souborech. V kapitole 9 se vysvětluje, jak lze pomocí programů PHP číst soubory a zapisovat do nich. V další kapitole 10 se podrobně probírá, jak sledovat uživatele. Zahrnuje nejenom práci s cookies u dočasných dat, ale také přihlašování uživatelů k účtům a sledování dat relace, například obsah nákupního vozíku. V kapitole 11 se budeme důkladně zabývat tím, jak může program PHP komunikovat s jinými weby a s webovými službami. Můžete získávat obsah jiných webových stránek nebo webových API a používat je ve svých
11 programech. Obdobně můžete využít PHP nejenom pro obsluhu obyčejných webových stránek, ale i pro odpovědi API jiným klientům. Následující další tři kapitoly již nebudou o tom, jak do programů začleňovat nové schopnosti: probírají se v nich věci, které napomáhají tomu, abyste se mohli stát lepším programátorem. V kapitole12 se vysvětluje, jak se programy ladí: jak se v nich hledají a opravují chyby. Kapitola 13 ukazuje, jak psát testy, s nimiž se prověřují různé části programu. Testování vám umožňuje ujistit se, že program dělá přesně to, co od něho očekáváte. V kapitole 14 pak hovoříme o některých aspektech softwarového inženýrství, které nejsou specifické pro PHP, nicméně byste je měli znát, pokud pracujete na projektech s jinými vývojáři. Poslední sekce knihy je kolekce krátkých exkurzí do několika úloh a témat. Ačkoliv nejsou tak zásadní, jako dříve probraná témata o základní struktuře PHP, nebo jak uchovávat informace, přesto se jedná o věci, na které dříve či později narazíte, až strávíte nějaký čas s PHP. Tyto kapitoly vám poskytnou potřebné základy. Kapitola 15 ukazuje schopnosti PHP pro práci s datem a s časem. V kapitole 16 se diskutuje o správě balíků (package management), která nabízí nesmírně zajímavý způsob, jak začleňovat do kódu užitečné knihovny napsané jinými lidmi. Kapitola 17 vysvětluje, jak odesílat z programu PHP e-mailové zprávy. V kapitole 18 se prozkoumávají tři oblíbené PHP frameworky, s nimiž můžete rychle začít pracovat na projektech, aniž byste museli psát spoustu běžného nudného kódu. V kapitole 19 se dozvíte, jak používat PHP z příkazového řádku, což může být šikovný způsob, jak psát jednoduché utility nebo testovat krátké programy. A konečně, v kapitole 20 je čtenáři knihy poskytnuto několik technik, jak vytvářet programy PHP, které bezchybně zvládnou zpracování textu psaného v různých jazycích a znakových sadách. Dva knižní dodatky obsahují dodatečný materiál. Chcete-li spouštět programy PHP, musíte mít na počítači nainstalovanou kopii PHP enginu (nebo mít účet u nějakého poskytovatele webového hostingu, který podporuje PHP). Dodatek A vám pomůže se zprovozněním PHP, ať už pracujete pod Windows, OS X nebo Linuxem. Dodatek B pak obsahuje odpovědi na cvičení zahrnutá v této knize.
Co v knize není Z pochopitelných důvodů nemůže tato kniha obsahovat úplně všechno, co je třeba vědět o PHP. Jejím hlavním cílem poskytnout úvod do PHP 7 a do základů počítačového programování. Pokud jste už programátorem PHP a zajímají vás pouze novinky obsažené v PHP 7, doporučujeme si obstarat knihu Upgrading to PHP 7, kterou napsal Davey Shafik (O’Reilly).1 Najdete v ní spoustu informací ohledně novinek a změn v této nejnovější verzi PHP. Další užitečné informace také najdete v komentovaném souhrnu odkazů a referencí, který sestavil Bruno Skvorc na SitePointu.2
Další zdroje Skvělým zdrojem pro prozkoumávání rozsáhlé knihovny funkcí PHP je online manuál PHP.3 Sami uživatelé do něj přispívají svými komentáři obsahujícími užitečné rady a ukázkové kódy. Kromě něj existuje celá řada e-mailových newsletterů zaměřených na PHP, které vám doporučujeme. Pokrývají problematiku instalace, programování, rozšiřování a spoustu dalších témat. O těchto newsletterech se více dozvíte na php.net, kde 1 2 3
http://www.oreilly.com/web-platform/free/upgrading-to-php-seven.csp http://bit.ly/skvorc-php7 http://www.php.net/manual
12 se také můžete přihlásit k jejich odběru. Rozhodně zde stojí zmínit i PHP Presentation System, což je archiv prezentací PHP z různých konferencí.4 Pokud se již vyznáte v nějakém jiném programovacím jazyku a chcete zvládnout i PHP, může být pro vás užitečný web s názvem PHP The Right Way.5 Až budete mít dobře zvládnutou látku probíranou v této knize, navázat na ni můžete četbou těchto knih: Programming PHP.6 Autoři Rasmus Lerdorf, Peter MacIntyre a Kevin Tatroe (O’Reilly). Podrobnější
a techničtější pohled na to, jak vytvářet programy v PHP. Zahrnuje informace o bezpečnosti, XML a generování grafik. PHP Cookbook.7 Autoři David Sklar a Adam Trachtenberg (O’Reilly). Vyčerpávající kolekce běžných
programovacích problémů PHP a jejich řešení. Modern PHP.8 Autor Josh Lockhart (O’Reilly). Jak už název napovídá, tato kniha není o syntaxi nebo
o specifických záležitostech v PHP. Pomůže vám s vytvářením kódu PHP v konzistentním, vysoce kvalitním stylu a s pochopením dobrých praktik softwarového inženýrství. Probírají se zde záležitosti tykající se například rozmisťování kódu (deployment), testování a profilování. Následující knihy pojednávají o databázích, SQL a MySQL: Learning PHP, MySQL & JavaScript.9 Autor Robin Nixon (O’Reilly). Vysvětluje, jak docílit harmonic-
ké spolupráce PHP, MySQL a JavaScriptu pro vybudování robustního dynamického webu. SQL in a Nutshell.10 Autoři Kevin E. Kline, Daniel Kline a Brand Hunt (O’Reilly). Probírají se nezbyt-
né znalosti, abyste mohli psát SQL dotazy. Nechybí ani informace o SQL dialektech, které používají Microsoft SQL Server, MySQL, Oracle a PostgreSQL. MySQL Cookbook.11 Autor Paul DuBois (O’Reilly). Vyčerpávající kolekce běžných úloh MySQL. MySQL Reference Manual.12 Nepostradatelný zdroj informací o schopnostech MySQL. MySQL profesionálně – Optimalizace pro vysoký výkon.13 Kolektiv autorů (Zoner Press). Kniha je
určena jak novým uživatelům MySQL, kteří si s MySQL zatím jen pohrávali a chystají se psát své první aplikace, tak i zkušeným uživatelům, kteří už mají za sebou dobře vyladěné aplikace založené na MySQL a chtějí z nich dostat nějaký ten výkon navíc.
Konvence používané v knize V knize se používají následující programovací a typografické konvence.
Programovací konvence Příklady kódu v knize jsou navrženy tak, aby pracovaly s PHP verze 7.0.0. Byly otestovány s PHP 7.0.5, což byla nejnovější verze PHP 7, která byla k dispozici v době vydání knihy. Pokud se někde v knize odkazujeme 4 5 6 7 8 9 10 11 12 13
http://talks.php.net/ http://www.phptherightway.com/ http://bit.ly/prog-php http://bit.ly/phpckbk3 http://bit.ly/modern_phps http://bit.ly/lpmjch_4e http://bit.ly/sql-nutshell http://bit.ly/mysql_ckbk_3e http://dev.mysql.com/doc/mysql https://www.zonerpress.cz/mysql-profesionalne-optimalizace-pro-vysoky-vykon
13 na funkce, které byly přidány do PHP 5.4.0 nebo pozdějších verzích, obvykle uvádíme, ve které verzi byla daná funkce do PHP přidána.
Typografické konvence V knize se používají následující typografické konvence: Text s neproporcionální písmem. Indikuje příkazy, volby, přepínače, proměnné, atributy, klíče, funkce,
typy, třídy, jmenné prostory, metody, moduly, vlastnosti, parametry, hodnoty, objekty, události, zpracovatele událostí, XML značky, HTML značky, makra, obsah souborů, názvy souborů, výstup z příkazů. TIP
Obsahuje tip, doporučení nebo všeobecnou poznámku.
UPOZORNĚNÍ
Obsahuje upozornění nebo varování.
Zdrojové soubory Přepisovat zdrojové kódy ručně do počítače bude pro vás užitečné jen tehdy, pokud se zrovna potřebujete naučit psát na klávesnici (což nepředpokládáme). Zdrojové kódy doporučujeme stáhnout z této adresy: http://soubory.zonerpress.cz/zrk1606
Kniha existuje proto, aby vám pomáhala s úlohami, které řešíte. Kód uvedený v této knize můžete používat ve svých programech nebo dokumentaci. Obvykle nemusíte žádat vydavatele o povolení za předpokladu, že nechcete někde reprodukovat podstatnou část kódu. Například, když píšete program, v němž použijete několik fragmentů kódu z této knihy, nemusíte žádat o povolení. Když budete prodávat nebo distribuovat CD-ROM obsahující příklady z našich knih, povolení potřebujete. Pokud chcete získat odpověď na nějakou otázku, ve které zmíníte tuto knihu a uvedete kód nějakého příkladu, povolení nepotřebujete. Chcete-li začlenit podstatnou část kódu příkladu z této knihy do dokumentace svého produktu, povolení potřebujete.
Poděkování Tato kniha je konečný výsledek tvrdé práce mnoha lidí. Konkrétně chci poděkovat: Mnoha programátorům, testerům, lidem, co píší dokumentaci, opravují chyby, i všem ostatním, je-
jichž čas, talent a zanícení učinily z PHP prvotřídní vývojovou platformu, jakou dnes máme. Bez nich bych skutečně neměl o čem psát. Mým pracovitým recenzentům, jimiž byli Thomas David Baker a Phil McCluskey. Zachytili spousty
chyb, matoucí vysvětlení přeměnili na jasná a celkově hodně přispěli k vylepšení této knihy. Mé editorce Ally MacDonaldové. Autor představuje jen jeden z mnoha dílků, které je třeba poskládat,
aby vznikla kniha, a Ally zajistila, aby vše, co se mělo stát s těmito dílky, se také s nimi opravdu stalo. Na závěr nesmím opomenout poděkovat Susannah, s níž si pořád užívám ignorování syntaxe věcí.
87
KAPITOLA 5 Seskupování logiky: funkce a soubory Při psaní počítačových programů je lenost ctností. Když opětovně využíváte kód, který jste napsali někdy předtím, snadněji dosáhnete toho, že budete pracovat co nejméně. Klíčem k opětovnému využívání kódu jsou funkce. Funkce je pojmenovaná sada příkazů, které vykonáte jednoduše tak, že se odvoláte na její název. Nemusíte psát tyto příkazy znovu. Ušetříte svůj čas a předejdete zbytečným chybám. Funkce navíc usnadňují použití kódu, který napsali jiní lidé (což už jste odhalili díky vestavěným funkcím, které vytvořili samotní autoři PHP enginu). Základy toho, jak definovat vlastní funkce a jak je volat, naleznete v sekci "Deklarace a volání funkcí". Když zavoláte nějakou funkci, můžete jí předat hodnoty, s nimiž pak může operovat. Pokud jste například napsali funkci, která kontroluje, zdali uživatel má povolený přístup k aktuální webové stránce, budete potřebovat takové funkci předat uživatelské jméno a název aktuální webové stránky. Těmto hodnotám se říká argumenty. V sekci "Předávání argumentů do funkcí" později v této kapitole se dozvíte, jak psát funkce, které přebírají argumenty, a jak se s těmito argumenty uvnitř funkcí pracuje. Některé funkce jsou jako jednosměrné ulice. Můžete do nich předat argumenty, ale zpět nedostanete nic. Funkce print_header(), která tiskne záhlaví HTML stránky, může převzít argument obsahující titulek (nadpis) stránky, ale poté, co se vykoná, neposkytne žádnou informaci. Prostě jen zobrazí výstup. Většina funkcí přesouvá informace oběma směry. Takovou je i výše zmíněná funkce kontrolující přístup ke stránce. Vrací hodnotu true (přístup udělen), nebo false (přístup odmítnut). Této hodnotě se říká návratová hodnota. S návratovou hodnotou funkce můžete pracovat stejně jako s jakoukoli jinou hodnotou nebo proměnnou. Návratové hodnoty se probírají v sekci "Vracení hodnot z funkcí". V příkazech, které se nachází uvnitř funkce, se proměnné používají stejně jako v příkazech, které jsou vně funkce. Proměnné nacházející se uvnitř funkce a proměnné nacházející se vně funkce ovšem žijí v naprosto oddělených světech. PHP engine považuje proměnnou s názvem $name, která je uvnitř funkce, a proměnnou $name, která je vně funkce, za dvě různé proměnné, které k sobě nemají žádný vztah. Pravidla stanovující, ve kterých částech programu se mohou používat které proměnné, se vysvětlují v sekci "Obor proměnných" dále v této kapitole. Je důležité těmto pravidlům dobře porozumět,
88
Kapitola 5 – Seskupování logiky: funkce a soubory
protože pokud je pochopíte nesprávně, hned máte kód, který se spoléhá na neinicializované nebo nekorektní proměnné. Výsledkem jsou chyby, které se špatně odhalují. Protože funkce jsou vhodné pro opětovné využívání kódu, v praxi je často velmi užitečné vytvářet samostatné soubory s definicemi funkcí a na tyto soubory se následně odkazovat ze samostatných programů. To umožňuje, aby různé programy (a různé části těchto programů) mohly sdílet funkce bez duplikování kódu. Více o této funkcionalitě naleznete v sekci "Spouštění kódu v jiném souboru".
Deklarace a volání funkcí Chcete-li vytvořit novou funkci, uveďte klíčové slovo function, za ním název funkce a pak dovnitř složených závorek tělo funkce. Příklad 5-1 deklaruje novou funkci s názvem page_header().1 Příklad 5-1. Deklarace funkce. function page_header() { print '<html><head><title>Welcome to my site</title></head>'; print '<body bgcolor="#ffffff">'; }
Názvy funkcí se řídí stejnými pravidly jako názvy proměnných: musejí začínat písmenem nebo podtržítkem, ostatní znaky mohou být písmena, číslice nebo podtržítka. PHP enginu nevadí, budete-li mít proměnnou a funkci se stejným názvem, ovšem v praxi byste se měli tomu pokud možno vyhýbat. Když má v programu mnoho věcí podobné názvy, nijak to nepřispívá k jeho srozumitelnosti. Funkci page_header() definovanou v příkladu 5-1 zavoláte úplně stejně, jako byste volali nějakou z vestavěných funkcí PHP. V příkladu 5-2 se s pomocí page_header() vytiskne kompletní stránka. Příklad 5-2. Volání funkce. page_header(); print "Welcome, $user"; print "</body></html>";
Funkce se mohou definovat předtím nebo až poté, co jsou zavolány. PHP engine přečte celý soubor programu a vezme na vědomí všechny definice funkcí, které v něm najde. Teprve poté začne spouštět příkazy uvedené v souboru. Funkce page_header() a page_footer() v příkladu 5-3 se obě vykonají úspěšně, přestože page_header() je definována před tím, než se zavolá, a page_footer() je definována až poté, co se zavolá. Příklad 5-3. Definice funkcí předtím nebo potom, co se zavolají. function page_header() { print '<html><head><title>Welcome to my site</title></head>'; print '<body bgcolor="#ffffff">'; } page_header();
1
Abychom byli přesní, závorky nejsou součástí názvu funkce, nicméně bývá dobrým zvykem je uvádět, když se na funkce odkazujete. Pomáhá to odlišit funkce od proměnných a jiných konstrukcí jazyka.
PHP 7
89
print "Welcome, $user"; page_footer(); function page_footer() { print '<hr>Thanks for visiting.'; print '</body></html>'; }
Předávání argumentů do funkcí Přestože některé funkce (jako page_header() v předchozí sekci) dělají vždy totéž, jiné funkce operují se vstupem, který se může měnit. Vstupním hodnotám dodávaným do funkce se říká argumenty. Argumenty přidávají funkcím na síle, stávají se flexibilnějšími. Upravme funkci page_header() tak, aby přebírala argument obsahující barvu stránky. Modifikovanou deklaraci funkce vidíte v příkladu 5-4. Příklad 5-4. Deklarace funkce s argumentem. function page_header2($color) { print '<html><head><title> Welcome to my site</title></head>'; print '<body bgcolor="#' . $color . '">'; }
Do deklarace funkce jsme přidali $color mezi závorky za názvem funkce. Kód uvnitř funkce pak bude moci používat proměnnou s názvem $color, která obsahuje hodnotu předávanou do funkce při jejím volání. Funkci můžete zavolat například takto: page_header2('cc00cc');
Uvnitř page_header2() tím nastavíte $color na cc00cc, takže vytiskne: <html><head><title> Welcome to my site</title></head><body bgcolor="#cc00cc">
Když definujete funkci, která přebírá nějaký argument (jako v příkladu 5-4), musíte jí předat argument, když ji voláte. Pokud takovou funkci zavoláte bez hodnoty pro její argument, PHP engine vydá upozornění. Pokud byste například zavolali page_header2() takto: page_header2();
engine vytiskne tenhle druh zprávy: PHP Warning: Missing argument 1 for page_header2()
Abyste upozornění (warning) tohoto druhu (chybí argument 1 pro...) nedostávali, definujte funkci tak, aby přebírala nepovinný argument. Zařídíte to tím, že v deklaraci funkce uvedete výchozí (default) hodnotu. Pokud při volání funkce dodáte hodnotu, funkce použije dodanou hodnotu. Pokud při volání funkce hodnotu nedodáte, použije funkce výchozí hodnotu. Výchozí hodnotu specifikujete tak, že ji uvedete za názvem argumentu. V příkladu 5-5 se nastaví výchozí hodnota pro $color na cc3399.
90
Kapitola 5 – Seskupování logiky: funkce a soubory
Příklad 5-5. Specifikace výchozí hodnoty argumentu. function page_header3($color = 'cc3399') { print '<html><head><title>Welcome to my site </title></head>'; print '<body bgcolor="#' . $color . '">'; }
Když zavoláte page_header3('336699'), dostanete stejný výsledek jako s voláním funkce page_ header2('336699'). Když se vykonává tělo těchto funkcí, má $color hodnotu 336699, což je barva určená pro atribut bgcolor značky <body>. Zatímco však volání page_header2() bez argumentu vyprodukuje upozornění, page_header3() můžete spustit bez argumentu, $color se nastaví na cc3399. Výchozí hodnoty pro argumenty musejí být literály, jako jsou 12, cc3399 nebo Shredded Swiss Chard. Nemohou to být proměnné. Následující kód není v pořádku a způsobí, že PHP engine zastaví běh programu: $my_color = '#000000'; // Tohle není správně: výchozí hodnota argumentu nemůže být proměnná function page_header_bad($color = $my_color) { print '<html><head><title>Welcome to my site </title></head>'; print '<body bgcolor="#' . $color . '">'; }
Chcete-li definovat funkci, která přebírá více argumentů, oddělujte je v deklaraci funkce čárkou. V příkladu 5-6 přebírá page_header4() dva argumenty: $color a $title. Příklad 5-6. Definice funkce přebírající dva argumenty. function page_header4($color, $title) { print '<html><head><title>Welcome to ' . $title . '</title></head>'; print '<body bgcolor="#' . $color . '">'; }
Když voláte funkci, která přebírá více argumentů, ve volání funkce je oddělujte čárkami. V příkladu 5-7 se volá page_header4() s hodnotami pro $color a $title. Příklad 5-7. Volání funkce přebírající dva argumenty. page_header4('66cc66','my homepage');
Příklad 5-7 vytiskne: <html><head><title>Welcome to my homepage</title></head><body bgcolor="#66cc66">
V příkladu 5-6 jsou oba argumenty povinné. Chcete-li u funkcí, které přebírají více argumentů, vyznačit pro argumenty výchozí hodnoty, dělá se to stejně jako u funkce, která přebírá jen jeden argument. Všechny nepovinné argumenty ovšem musí následovat až za povinnými argumenty. Příklad 5-8 ukazuje správné způsoby definice funkce se třemi argumenty, když jeden z nich, dva nebo všechny tři jsou nepovinné. Příklad 5-8. Několik nepovinných argumentů. // Je-li nepovinný jeden argument, musí být poslední function page_header5($color, $title, $header = 'Vítejte') {
PHP 7
91
print '<html><head><title>Welcome to ' . $title . '</title></head>'; print '<body bgcolor="#' . $color . '">'; print "<h1>$header</h1>"; } // Přípustná volání této funkce: page_header5('66cc99','my wonderful page'); // použije výchozí $header page_header5('66cc99','my wonderful page', 'This page is great!'); // použije hodnotu uvedenou ve volání // Jsou-li nepovinné dva argumenty, musejí být uvedené jako poslední dva function page_header6($color, $title = 'the page', $header = 'Welcome to ') { print '<html><head><title>Welcome to ' . $title . '</title></head>'; print '<body bgcolor="#' . $color . '">'; print "<h1>$header</h1>"; } // Přípustná volání této funkce: page_header6('66cc99'); // použije výchozí hodnoty pro $title a $header page_header6('66cc99', 'my wonderful page'); // použije výchozí $header page_header6('66cc99', 'my wonderful page', 'This page is great!'); // použije hodnoty uvedené ve volání // Všechny argumenty jsou nepovinné function page_header7($color = '336699', $title = 'the page', $header = 'Welcome') { print '<html><head><title>Welcome to ' . $title . '</title></head>'; print '<body bgcolor="#' . $color . '">'; print "<h1>$header</h1>"; } // Přípustná volání této funkce: page_header7(); // použije výchozí hodnoty pro všechny argumenty page_header7('66cc99'); // použije výchozí pro $title a $header page_header7('66cc99','my wonderful page'); // použije výchozí pro $header page_header7('66cc99','my wonderful page', 'This page is great!'); // použije hodnoty uvedené ve volání
Všechny nepovinné argumenty musejí být na konci seznamu argumentů, aby se zamezilo vzniku nejednoznačnosti. Kdyby se mohla funkce page_header7() definovat s prvním povinným argumentem $color, druhým volitelným argumentem $title a třetím povinným argumentem $header, co by pak znamenalo volání page_header7('33cc66','Good Morning')? Argument 'Good Morning' by mohl být hodnotou buď pro $title, nebo pro $header. Nicméně, když se všechny nepovinné argumenty uvádějí až za povinnými, k takovým zmatkům vůbec nedochází.
265
KAPITOLA 15 Datum a čas Datum a čas se ve webové aplikaci vyskytují všude. V nákupním vozíku potřebujete pracovat s datem expedice zakoupených produktů. Na fóru je třeba sledovat, kdy byly jednotlivé příspěvky zveřejněny. V aplikacích všech možných druhů je potřeba evidovat, kdy se jednotliví uživatelé naposledy přihlásili, abyste je mohli například informovat, že "od vašeho posledního přihlášení přibylo 15 nových zpráv". Řádná práce s datumem a časem je v programech o něco složitější, než když pracujete s řetězci nebo s čísly. Datum nebo čas nejsou jediná hodnota, ale kolekce hodnot: například den, měsíc a rok, nebo hodina, minuta a sekunda. Z tohoto důvodu mohou být matematické operace s nimi dost obtížné. Nemůžete prostě sčítat nebo odečítat dva kompletní datumy či dva kompletní časy, musíte brát v úvahu jednotlivé komponenty i povolené rozsahy hodnot jednotlivých komponent. Hodin může být nejvýše 12 (nebo 24), minut a sekund nejvýše 59, přičemž všechny měsíce nemají stejný počet dní. PHP vás zbavuje tohoto obtížného břemene, protože poskytuje třídu DateTime, kde jsou zapouzdřeny veškeré informace o konkrétním časovém okamžiku. S metodami této třídy vytisknete datum nebo čas v takovém formátu, jaký si zvolíte, budete moci sečíst dvě data, odečíst jedno datum od jiného i pracovat s časovými intervaly. V této knize chápeme pod termínem komponenty času (nebo komponenty data nebo komponenty data a času) pole nebo skupinu dílčích částí data a času, jako jsou den, měsíc, rok, hodina, minuta a sekunda. Naformátovaný řetězec času (nebo naformátovaný řetězec data atd.) znamená řetězec, který obsahuje nějaké konkrétní seskupení komponent pro datum a čas, například "Thursday, October 20, 2016" nebo "3:54 p.m".
Zobrazování data nebo času Nejjednodušším zobrazením data nebo času je situace, kdy uživatelům sdělíte, co je dnes za den a kolik je hodin. K tomuto účelu zavolejte metodu format() objektu DateTime, jak to vidíte v příkladu 15-1. Příklad 15-1. Co je dnes za den a kolik je hodin? $d = new DateTime();
266
Kapitola 15 – Datum a čas
print 'It is now: '; print $d->format('r'); print "\n";
UPOZORNĚNÍ Když spustíte kód z příkladu 15-1 a PHP engine zobrazí upozornění "It is not safe to rely on the system’s timezone settings", přejděte do sekce "Časová pásma", kde se dozvíte, co tato hláška znamená a jak se jí zbavit.
V poledne 20. října 2016 příklad 15-1 vytiskne: It is now: Thu, 20 Oct 2016 12:00:00 +0000
Když vytvoříte objekt DateTime, datum nebo čas v něm uložené jsou k dispozici prostřednictvím konstruktoru. Nedodá-li se mu žádný argument, jako v příkladu 15-1, použije se aktuální datum a čas. Formátovací řetězec předaný metodě format() určuje, jak budou datum a čas naformátovány při tisku. Jednotlivá písmena ve formátovacím řetězci se překládají do odpovídajících komponent data nebo času. Příklad 15-2 vytiskne měsíc, den a rok. Příklad 15-2. Vytištění naformátovaného řetězce data. $d = new DateTime(); print $d->format('m/d/y');
V poledne 20. října 2016 příklad 15-2 vytiskne: 10/20/16
V příkladu 15-2 m zastupuje měsíc (10), d zastupuje den v měsíci (20) a y zastupuje dvoumístný rok (16). Protože lomítko nepatří mezi formátovací znaky metody format(), lomítka zůstanou v řetězci, který format() vrátí. Všechny speciální znaky, kterým rozumí DateTime::format(), jsou vypsány v tabulce 15-1. Tabulka 15-1. Formátovací znaky pro datum a čas. Typ
Formátovací znak
Popis
Rozsah/ukázka
Den
j
Pořadové číslo dne v měsíci; číslo
1–31
Den
d
Pořadové číslo dne v měsíci; číslo; s vedoucí nulou
01–31
Den
S
Sufix pořadové číslovky v angličtině pro den nebo měsíc, text
st, th, nd, rd
Den
z
Pořadové číslo dne v roce; číslo
0–365
Den
w
Pořadové číslo dne v týdnu; číslo; 0 == Neděle
0–6
Den
N
Pořadové číslo dne v týdnu; číslo; 1 == Pondělí
1–7
Den
D
Zkrácený název dne v týdnu; text
Mon–Sun
PHP 7
Praktický průvodce nejrozšířenějším skriptovacím jazykem pro web Nudné weby jsou statické. Zajímavé weby jsou dynamické. Pokud chcete začít pracovat s PHP, nejrozšířenějším skriptovacím jazykem pro web, tato kniha je určena právě vám. Její autor, David Sklar, vás provede všemi aspekty PHP, které jsou nezbytné k tomu, abyste mohli začít budovat dynamické webové stránky. Prozkoumáním funkcionalit a vylepšení obsažených v PHP 7 se dozvíte, jak například pracovat s webovými servery, databázemi a webovými službami. Na konci většiny kapitol pak naleznete praktická cvičení, která vám umožní otestovat si, jak moc dobře jste pochopili právě probíranou látku.
slevy, akce,
novinky
Ladění Testování: funguje váš program správně? Užitečné praktiky softwarového inženýrství Datum a čas Správa balíků Odesílání e-mailových zpráv Frameworky PHP na příkazovém řádku Internacionalizace a lokalizace Instalace a konfigurace PHP enginu Řešení ke cvičením v knize
© pixabay.com (2938551)
Kapitoly obsažené v knize: Orientace a první kroky Data: práce s textem a s čísly Logika: rozhodování a smyčky Seskupování dat: práce s poli Seskupování logiky: funkce a soubory Data a logika dohromady: práce s objekty Výměna informací: webové formuláře Uchovávání informací: databáze Práce se soubory Zapamatování uživatelů: cookie a relace Komunikace s jinými weby a se službami
Nechejte nám kontakt na novinky.zonerpress.cz a získáte další bonusy, slevy a jiné výhody.
DOPORUČENÁ CENA: 499 KČ KATALOGOVÉ ČÍSLO: ZRK1606
P R E S S
PHP 7
Praktický průvodce nejrozšířenějším skriptovacím jazykem pro web
David Sklar
David Sklar
Z O N E R
PHP 7
Praktický průvodce nejrozšířenějším skriptovacím jazykem pro web
E N C Y K L O P E D I E
ISBN 978-80-7413-363-3
Zoner Press tel.: 532 190 883 e-mail: knihy@zoner.cz www.zonerpress.cz ZONER software, a.s., Nové sady 18, 602 00 Brno
9 7 8 8 0 7 4 1 3 3 6 3 3
David Sklar