IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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:

Analyzátor viet
localhost

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é 631x (2.05 kB)
Aplikácia je vrátane zdrojových kódov v jazyku php

 

Predchádzajúci článok
Riešené úlohy k 14. lekcii PHP
Všetky články v sekcii
Základné konštrukcie jazyka PHP
Preskočiť článok
(neodporúčame)
Dátové typy v PHP
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity