15. diel - Tvorba knižníc v PHP
V predchádzajúcom cvičení, Riešené úlohy k 14. lekcii PHP, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V minulej lekcii, Riešené úlohy k 14. lekcii PHP , sme sa naučili deklarovať vlastné funkcie. V dnešnom PHP tutoriálu sa je naučíme logicky zoskupovať do knižníc a všetko si prakticky vyskúšame na jednoduchej aplikácii.
Tvorba knižníc
Funkcia zvyčajne nezapisuje len tak niekam do stránky, ale vkladáme ich do
knižníc. Knižnica nie je nič iné, než súbor s príponou
.php
, v ktorom na začiatku otvoríme PHP sekvenciu a potom do neho
pod seba vložíme niekoľko funkcií. Knižnica by samozrejme mala obsahovať
len tie funkcie, ktoré súvisia s jej zameraním. Pre každé zameranie si
vytvoríme inú knižnicu (napr. emaily.php
,
matematika.php
, databaze.php
...) a vyvarujeme sa
tvoreniu "božských knižníc" všetkého v jednom súbore.
Vytvorme si knižnicu k posielanie emailov. Bude zatiaľ obsahovať len jednu
funkciu a tou bude tá z minulého dielu. Obsah knižnice
emaily.php
bude nasledujúci:
<?php /* * Knižnica pre prácu s emailami */ function odesliEmail($adresa, $predmet, $odesilatel, $zprava) { $hlavicka = 'From:' . $odesilatel; $hlavicka .= "\nMIME-Version: 1.0\n"; $hlavicka .= "Content-Type: text/html; charset=\"utf-8\"\n"; $predmet = 'Nová správa z mailformu'; $uspech = mb_send_mail($adresa, $predmet, $zprava, $hlavicka); return $uspech; }
Funkciou môžeme do knižnice vložiť samozrejme koľko chceme, mohla by tu byť napr. Ešte funkcia, čo kontroluje správnosť zadanej emailovej adresy. Všimnite si, že na konci súboru chýbajú uzavretie PHP sekvencie. Je to z toho dôvodu, že v knižnici je len PHP kód, direktíva sa sama uzavrie, až sa PHP dostane na koniec súboru. Ide tiež o odporúčanie, pretože pár bielych znakov za uzatvorením PHP sekvencie by mohlo v určitých prípadoch vyvolať nepríjemné chyby.
Akonáhle máme knižnicu hotovú, jednoducho ju uložíme do zložky s webom
a v súboroch, v ktorých ju budeme chcieť použiť, ju načítame. Asi vás
neprekvapí, že zavedenie knižnice vykonáme pomocou funkcie
require()
. O tej vieme, že do súboru vloží obsah iného súboru
a to tak, že vykoná prípadné vložené skripty. V našom prípade teda
deklaruje funkcie, ktoré knižnica obsahuje. Aby sme sa vyvarovali toho, že
knižnicu omylom niekde načítame aj vtedy, keď už je načítaná, použijeme
variantu require_once()
. Tá nič neurobí v prípade, že
knižnica už bola načítaná. Samozrejme platí, že ak zobrazujeme celý web
pomocou index.php
, stačí knižnicu načítať len raz tu. Ak
máme však oddelené stránky, musíme ju načítať na začiatku každej
stránky, v ktorej chceme funkcie z knižnice používať.
require_once('emaily.php'); odesliEmail('[email protected]', 'Test emailu', '[email protected]', 'Text správy');
Funkcia je deklarovaná v knižnici a nám stačí už len knižnicu načítať a začať funkciu používať. Ak budete tento princíp využívať, budú vaše aplikácie veľmi prehľadné. Poďme si precvičiť prácu s textovými reťazcami a za týmto účelom si vytvorme vlastnú knižnicu.
Analyzátor viet
Naprogramujte si jednoduchý analyzátor viet, ktorému zadáme vetu a on vypíše počet znakov vo vete, ďalej počet samohlások, počet spoluhlások a počet ostatných znakov.
Knižnica
Začneme knižnicou. Vieme, že pre počet znakov máme funkciu
mb_strlen()
. Zistenie počtu samohlások a spoluhlások za nás
však už PHP neurobí a preto si na to založíme knižnicu. Pomenujeme ju
analyzaVet.php
. Jej obsah bude nasledujúce:
<?php /** * Knižnica pre analýzu viet */ function pocetSamohlasek($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; } function pocetSouhlasek($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á funkcia si najprv definuje premenné $text
a
$delka
, kde je dĺžka textu v znakoch. Do poľa
$samohlasky
(resp. $souhlasky
) si uloží znaky,
ktorých počet nás zaujíma. Ďalej si vytvorí premennú $pocet
,
do ktorej dá počiatočnú hodnotu 0
. Potom cyklom
for
prejde všetky znaky a aktuálny znak vždy uloží do
premennej $znak
. Pomocou funkcie in_array()
zistí,
či pole obsahuje daný znak. Ak áno, započíta ho. Ďalej nezostáva nič
iné, než výslednú hodnotu vrátiť.
Iste ste si všimli, že sa obe funkcie líšia len obsahom poľa. Môžeme
kód výrazne optimalizovať tým, že vytvoríme univerzálne funkciu, ktorá
berie na vstupe reťazec a znaky, ktoré nás zaujímajú. Túto funkciu budeme
potom volať vo funkciách pocetSamohlasek()
a
pocetSouhlasek()
.
Obsah súboru s identickou funkcionalitou by mohol vyzerať takto:
<?php /** * Knižnica pre analýzu viet */ function pocetZnaku($text, $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; } function pocetSamohlasek($text) { $samohlasky = array('A', 'E', 'I', 'O', 'U', 'Y'); return pocetZnaku($text, $samohlasky); } function pocetSouhlasek($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); }
Pomerne zaujímavú úlohu sme rozdelili do 3
funkcií. Vidíme,
že funkcie sú našimi spojencami a dokážu nám zjednodušiť život. Stačí
totiž len zavolať tú istú funkciu s inými parametrami namiesto toho, aby
sme kopírovali celý kód znova.
Teraz si vytvoríme súbor analyza.php
, kam vložíme formulár
na zadanie vety, načítame knižnicu a pomocou nej zistíme danej počty:
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Analyzátor viet</title> </head> <body> <h1>Analyzátor viet</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ýsledok analýzy:</h2>'); echo('<table>'); echo('<tr><td>Znakov</td><td>' . htmlspecialchars($znaku) . '</td></tr>'); echo('<tr><td>Samohlások</td><td>' . htmlspecialchars($samohlasek) . '</td></tr>'); echo('<tr><td>Spoluhlások</td><td>' . htmlspecialchars($souhlasek) . '</td></tr>'); echo('</table>'); } } ?> <p>Zadajte vetu na analýzu</p> <form method="post"> <textarea name="zprava"></textarea><br /> <input type="submit" value="Analyzovať" /> </form> </body> </html>
výsledok:
Skúste sa zamyslieť nad tým, ako by vyzeral zdrojový kód bez použitia funkcií (nebol by vôbec pekný). Diakritiku som neriešil, môžete si ju do polí pridať. Na knižnice sa obvykle tiež vytvára nejaká zložka, keď je ich viac.
Všeobecne je snaha čo najviac logiky presunú do knižníc (neskôr objektov) a v súboroch s HTML stránkou mať naozaj len to najnutnejšie. Toto je úplný základ oddelenie logiky a výstupu. Časom sa dostaneme napr. K MVC architektúre, kde je tento princíp dovedený do dokonalosti. Knižnice a funkcie si bohato precvičíme v ďalšom seriáli o prácu s databázami.
Kam ďalej?
Náš arzenál vedomostí je teraz pripravený na to, aby sme sa pustili do databáz. Naša výučba PHP pokračuje kurzom Databázy v PHP pre začiatočníkov.
V ďalšej lekcii, Dátové typy v PHP , si ukážeme dátové typy v PHP, čo to je dynamické typovanie a ako s jednotlivými dátovými typmi pracovať.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 639x (2.05 kB)
Aplikácia je vrátane zdrojových kódov v jazyku php