Lekce 17 - Tvorba knihoven v PHP
V předešlém cvičení, Řešené úlohy k 16. lekci PHP, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
V dnešním PHP tutoriálu se naučíme logicky seskupovat funkce do knihoven a vše si prakticky vyzkoušíme na jednoduché aplikaci.
Tvorba knihoven
Funkce obvykle nezapisujeme jen tak někam do stránky, ale vkládáme je do
knihoven. Knihovna není nic jiného, než soubor s příponou
.php
, ve kterém na začátku otevřeme PHP sekvenci a poté do
něj pod sebe vložíme několik funkcí. Knihovna by samozřejmě měla
obsahovat jen ty funkce, které souvisí s jejím zaměřením. Pro každé
zaměření si vytvoříme jinou knihovnu (např. emaily.php
,
matematika.php
, databaze.php
...) a vyvarujeme se
tvoření "božských knihoven" všeho v jednom souboru.
Vytvořme si knihovnu k posílání emailů. Bude zatím obsahovat jen jednu
funkci a tou bude ta z minulého dílu. Obsah knihovny emaily.php
bude následující:
/** * Knihovna pro práci s emaily * * @param string $adresa Adresa příjemce * @param string $predmet Předmět * @param string $odesilatel Odesílatel * @param string $zprava Zpráva * @return bool Vrátí hodnotu true, pokud byl email odeslán */ function odesliEmail(string $adresa, string $predmet, string $odesilatel, string $zprava) { $hlavicka = 'From:' . $odesilatel; $hlavicka .= "\nMIME-Version: 1.0\n"; $hlavicka .= "Content-Type: text/html; charset=\"utf-8\"\n"; return mb_send_mail($adresa, $predmet, $zprava, $hlavicka); }
Funkcí můžeme do knihovny vložit samozřejmě kolik chceme, mohla by zde být např. ještě funkce, co kontroluje správnost zadané emailové adresy. Všimněte si, že na konci souboru chybí uzavření PHP sekvence. Je to z toho důvodu, že v knihovně je jen PHP kód, direktiva se sama uzavře, až se PHP dostane na konec souboru. Jedná se také o doporučení, protože pár bílých znaků za uzavřením PHP sekvence by mohlo v určitých případech vyvolat nepříjemné chyby.
Jakmile máme knihovnu hotovou, jednoduše ji uložíme do složky s webem a
v souborech, ve kterých ji budeme chtít použít, ji načteme. Asi vás
nepřekvapí, že načtení knihovny provedeme pomocí funkce
require()
. O té víme, že do souboru vloží obsah jiného
souboru a to tak, že vykoná případné vložené skripty. V našem případě
tedy deklaruje funkce, které knihovna obsahuje. Abychom se vyvarovali toho, že
knihovnu omylem někde načteme i tehdy, když už je načtená, použijeme
variantu require_once()
. Ta nic neudělá v případě, že
knihovna již byla načtena. Samozřejmě platí, že pokud zobrazujeme celý
web pomocí souboru index.php
, stačí knihovnu načíst jen jednou
zde. Pokud máme však oddělené stránky, musíme ji načíst na začátku
každé stránky, ve které chceme funkce z knihovny používat.
require_once('emaily.php'); odesliEmail('[email protected]', 'Test emailu', '[email protected]', 'Text zprávy');
Funkce je deklarována v knihovně a nám stačí již jen knihovnu načíst a začít funkci používat. Pokud budete tento princip využívat, budou vaše aplikace velmi přehledné. Pojďme si procvičit práci s textovými řetězci a za tímto účelem si vytvořme vlastní knihovnu.
Analyzátor vět
Naprogramujme si jednoduchý analyzátor vět, kterému zadáme větu a on vypíše počet znaků ve větě, dále počet samohlásek, počet souhlásek a počet ostatních znaků.
Knihovna
Začneme knihovnou. Víme, že pro počet znaků máme funkci
mb_strlen()
. Zjištění počtu samohlásek a souhlásek za nás
však již PHP neudělá a proto si na to založíme knihovnu. Pojmenujeme ji
analyzaVet.php
. Její obsah bude následující:
/** * Knihovna pro analýzu vět */ /** * Spočítá počet samohlásek v textu * * @param string $text Text * @return int Počet samohlásek v textu */ function pocetSamohlasek(string $text) { $text = mb_strtoupper($text); $delka = mb_strlen($text); $samohlasky = array('A', 'E', 'I', 'O', 'U', 'Y'); $pocet = 0; for ($i = 0; $i < $delka; $i++) { $znak = mb_substr($text, $i, 1); if (in_array($znak, $samohlasky)) $pocet++; } return $pocet; } /** * Spočítá počet souhlásek v textu * * @param string $text Text * @return int Počet souhlásek v textu */ function pocetSouhlasek(string $text) { $text = mb_strtoupper($text); $delka = mb_strlen($text); $souhlasky = array('B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Z'); $pocet = 0; for ($i = 0; $i < $delka; $i++) { $znak = mb_substr($text, $i, 1); if (in_array($znak, $souhlasky)) $pocet++; } return $pocet; }
Každá funkce si nejprve definuje proměnné $text
a
$delka
, kde je délka textu ve znacích. Do pole
$samohlasky
(resp. $souhlasky
) si uloží znaky,
jejichž počet nás zajímá. Dále si vytvoří proměnnou
$pocet
, do které dá počáteční hodnotu 0
. Potom
cyklem for
projede všechny znaky a aktuální znak vždy uloží
do proměnné $znak
. Pomocí funkce in_array()
zjistí, zda pole obsahuje daný znak. Pokud ano, započítá ho. Dále
nezbývá nic jiného, než výslednou hodnotu vrátit.
Jistě jste si všimli, že se obě funkce liší jen obsahem pole. Můžeme
kód výrazně optimalizovat tím, že vytvoříme univerzální funkci, která
bere na vstupu řetězec a znaky, které nás zajímají. Tuto funkci budeme
poté volat ve funkcích pocetSamohlasek()
a
pocetSouhlasek()
.
Obsah souboru s identickou funkcionalitou by mohl vypadat takto:
/** * Knihovna pro analýzu vět */ /** * Počet znaků * * @param string $text Text * @param array $znaky Znaky, které se mají spočítat * @return int Počet znaků v textu */ function pocetZnaku(string $text, array $znaky) { $text = mb_strtoupper($text); $delka = mb_strlen($text); $pocet = 0; for ($i = 0; $i < $delka; $i++) { $znak = mb_substr($text, $i, 1); if (in_array($znak, $znaky)) $pocet++; } return $pocet; } /** * Spočítá počet samohlásek v textu * * @param string $text Text * @return int Počet samohlásek v textu */ function pocetSamohlasek(string $text) { $samohlasky = array('A', 'E', 'I', 'O', 'U', 'Y'); return pocetZnaku($text, $samohlasky); } /** * Spočítá počet souhlásek v textu * * @param string $text Text * @return int Počet souhlásek v textu */ function pocetSouhlasek(string $text) { $souhlasky = array('B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Z'); return pocetZnaku($text, $souhlasky); }
Poměrně zajímavou úlohu jsme rozdělili do třech funkcí. Vidíme, že funkce jsou našimi spojenci a dokáží nám zjednodušit život. Stačí totiž jen zavolat tu samou funkci s jinými parametry místo toho, abychom kopírovali celý kód znovu.
Nyní si vytvoříme soubor analyza.php
, kam vložíme
formulář na zadání věty, načteme knihovnu a pomocí ní zjistíme dané
počty:
<!DOCTYPE html> <html lang="cs"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Analyzátor vět</title> </head> <body> <h1>Analyzátor vět</h1> <?php require_once('analyzaVet.php'); if ($_POST) { if (isset($_POST['zprava'])) { $zprava = $_POST['zprava']; $znaku = mb_strlen($zprava); $samohlasek = pocetSamohlasek($zprava); $souhlasek = pocetSouhlasek($zprava); echo('<h2>Výsledek analýzy:</h2>'); echo('<table>'); echo('<tr><td>Znaků</td><td>' . htmlspecialchars($znaku) . '</td></tr>'); echo('<tr><td>Samohlásek</td><td>' . htmlspecialchars($samohlasek) . '</td></tr>'); echo('<tr><td>Souhlásek</td><td>' . htmlspecialchars($souhlasek) . '</td></tr>'); echo('</table>'); } } ?> <p>Zadejte větu k analýze</p> <form method="post"> <textarea name="zprava"></textarea><br /> <input type="submit" value="Analyzovat" /> </form> </body> </html>
Výsledek:
Zkuste se zamyslet nad tím, jak by vypadal zdrojový kód bez použití funkcí (nebyl by vůbec hezký). Diakritiku jsem neřešil, můžete si ji do polí přidat. Na knihovny se obvykle také vytváří nějaká složka, když je jich více.
Obecně je snaha co nejvíce logiky přesunou do knihoven (později objektů) a v souborech s HTML stránkou mít opravdu jen to nejnutnější. Toto je úplný základ oddělení logiky a výstupu. Časem se dostaneme např. k MVC architektuře, kde je tento princip doveden do dokonalosti. Knihovny a funkce si bohatě procvičíme v dalším seriálu o práci s databázemi.
Kam dál?
Náš arzenál znalostí je nyní připraven k tomu, abychom se pustili do databází. Naše výuka PHP pokračuje kurzem Databáze v PHP pro začátečníky.
V příští lekci, Matematické funkce v PHP, se seznámíme se všemi důležitými funkcemi a konstantami týkající se matematiky nebo práce s čísly v PHP.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 642x (2.05 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP