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í.

10. diel - Triedny prvky v PHP druhýkrát - konštanty

V minulej lekcii, Kvíz - Dátové typy, dedičnosť a polymorfizmus v PHP , sme si uviedli statiku a ukázali dve jej praktická využitie. Dnes v PHP tutoriálu budeme v podobnom duchu pokračovať a povieme si ešte viac o triednych prvkoch.

Overenie hesla

Rozšírte ešte náš príklad z minula. Dajme tomu, že sa naši ľudia registrujú do nejakého systému. Okrem svojho mena zadávajú ešte heslo. Než človeka vytvoríme, je nutné heslo overiť, či nie je moc krátke.

Metóda na overenie dĺžky hesla k človeku logicky patrí. Vo chvíli, keď heslo overujeme (napr. Z formulára) ale ešte nemáme človeka vytvoreného. Aby sme ho vytvorili, potrebujeme poznať meno, priezvisko, vek a heslo, pretože človek je vyžaduje v konstruktoru. Aby sme však zavolali metódu pre overenie hesla, potrebujeme mať vytvorenú inštanciu človeka. Problém vyriešime tak, že metódu na overenie hesla napíšeme ako statickú. Tak ju budeme môcť zavolať aj bez inštancie a zároveň bude logicky zaradená v triede Clovek, kam patrí.

Overenie je značne zjednodušené, v reáli by sa overovalo či heslo neobsahuje diakritiku a podobne. Triede Clovek pridáme privátne inštančný premennú $ heslo. Prečo je $ heslo privátne snáď nemusím vysvetľovať.

private $heslo;

Ďalej upravíme konštruktor tak, aby sa používateľ mohol vytvoriť len so zadaným heslom:

public function __construct($jmeno, $prijmeni, $vek, $heslo)
{
    $this->jmeno = $jmeno;
    $this->prijmeni = $prijmeni;
    $this->vek = $vek;
    self::$pocetLidi++;
    $this->id = self::$pocetLidi;
    $this->heslo = $heslo;
}

Podobne upravte aj konštruktor Javisty z minulých lekcií, aby sa nám nerozbil, ešte ho budeme potrebovať.

Heslo by sa malo nejaký spôsobom Hashovať, teraz to pre jednoduchosť zanedbáme, podrobnejšie sa to rieši v ďalších seriáloch. Triede nakoniec pridajme statickú verejnú metódu validniHeslo ():

public static function validniHeslo($heslo)
{
    return (mb_strlen($heslo) >= 5);
}

Metóda vráti true ak je dĺžka hesla väčší ako 5 znakov, inak vráti false. Až na použitie funkcie mb_strlen () v nej nie je nič zaujímavé. Asi viete, že funkcia mb_strlen () vie na rozdiel od zastarané strlen () pracovať s kódovaním UTF-8. Kódovanie pre tieto funkcie však musíme v indexe nastaviť. Niekam na začiatok teda pridajme:

mb_internal_encoding("UTF-8");

Viac informácií o funkcii nájdete v českom PHP manuáli.

V indexe si skúsime jednoducho realizovať scenár registrácia nového človeka do systému:

$heslo = 'heslojeveslo';
if (Clovek::validniHeslo($heslo))
{
    $clovek = new Clovek('Jan', 'Novák', 32, $heslo);
    echo('Heslo OK');
}
else
    echo('Heslo musí být dlouhé minimálně 5 znaků');

class Clovek
{

    public $jmeno;
    public $prijmeni;
    public $vek;
    private $unava = 0;
    public $id;
    private static $pocetLidi = 0;
    private $heslo;

    public function __construct($jmeno, $prijmeni, $vek, $heslo)
    {
        $this->jmeno = $jmeno;
        $this->prijmeni = $prijmeni;
        $this->vek = $vek;
        self::$pocetLidi++;
        $this->id = self::$pocetLidi;
        $this->heslo = $heslo;
    }

    public function spi($doba)
    {
        $this->unava -= $doba * 10;
        if ($this->unava < 0)
            $this->unava = 0;
    }

    public function behej($vzdalenost)
    {
        if ($this->unava + $vzdalenost <= 20)
            $this->unava += $vzdalenost;
        else
            echo('Jsem příliš unavený.');
    }

    public function pozdrav()
    {
        echo('Ahoj, já jsem ' . $this->jmeno);
    }

    protected function celeJmeno()
    {
        return $this->jmeno . ' ' . $this->prijmeni;
    }

    public function __toString()
    {
        return $this->jmeno . ' - ' . $this->id;
    }

    public static function validniHeslo($heslo)
    {
        return (mb_strlen($heslo) >= 5);
    }

}
class Javista extends Clovek
{
    public $ide;

    public function __construct($jmeno, $prijmeni, $vek, $heslo, $ide)
    {
        $this->ide = $ide;
        parent::__construct($jmeno, $prijmeni, $vek, $heslo);
    }

    public function programuj()
    {
        echo("Programuji v {$this->ide}...");
    }

    public function pozdrav()
    {
        echo('Hello world! Jsem ' . $this->jmeno);
    }

}

Validačný metódu je možné volať bez inštancie, čo sa v našej situácii hodí.

Konštanty

Medzi triedny prvky patrí tiež konštanty. Ako iste z matematiky poznáme, jedná sa o nejakú nemennú hodnotu. Konštanty sú vždy statické, hoci sa pred nich modifikátor static nepíše. Definujú sa kľúčovým slovom const a patrí vždy nejaké triede. Ich názov sa píše veľkými písmenami, miesto medzier sa používajú podčiarknutia. Píšu sa ako prvá v triede, ešte pred atribúty.

Konštanta Pí

Pridajme si konštantu PI do našej triedy Matematika.php z minula:

class Matematika
{

    const PI = 3.14159265358979;

    public static function naDruhou($zaklad)
    {
        return $zaklad *$zaklad;
    }

}

V index.php si ju skúsme použiť:

require_once('tridy/Matematika.php');

$polomer = 5;
$obsah = Matematika::PI * Matematika::naDruhou($polomer);
echo("Obsah kruhu je $obsah cm<sup>2</sup>.");
class Matematika
{

    const PI = 3.14159265358979;

    public static function naDruhou($zaklad)
    {
        return $zaklad *$zaklad;
    }

}

výsledok:

Tvoja stránka
localhost

Konštanta minimálnej dĺžky hesla

Konštanta sa nám hneď hodí pre minimálnu dĺžku hesla. Keď sa ju niekedy rozhodneme zmeniť alebo ju budeme chcieť použiť na viacerých miestach, bude prehľadne definovaná raz na začiatku triedy. Pridajme k našej triede Clovek.php konštantu DELKA_HESLA nastavenú na hodnotu 5:

const DELKA_HESLA = 5;

Teraz nahradíme päťku v metóde validniHeslo () za túto konštantu. Keďže sa jedná o triedny prvok, použijeme na prístup ku konštante zvnútra triedy kľúčové slovo self:

public static function validniHeslo($heslo)
{
    return (mb_strlen($heslo) >= self::DELKA_HESLA);
}

Program funguje ako predtým a dôležitá konštanta je prehľadne na začiatku triedy. Ku konštante môžeme samozrejme opäť pristupovať aj mimo triedu:

echo('Vítejte v registraci, zvolte si uživatelské jméno a heslo o minimální délce ' . Clovek::DELKA_HESLA);

Konštanty by sme mali využívať vo svojich aplikácií zakaždým, keď definujeme nejakú nemennú hodnotu. Často je využívam pre rôzne limity, napr. Maximálny počet udalostí na člena:

const MAX_UDALOSTI = 50;

Vymenované typy (ENUM) v PHP

Konštanty sa v PHP často využívajú pre nahradenie tzv. Vymenovaných typov, ktoré PHP neobsahuje. Síce sa dajú nahradiť pomocou tried, ale používanie konštánt sa uchytilo viac, pretože je to jednoduchšie.

Keď máme v aplikácii premennú, ktorá nadobúda vždy jednej hodnoty z určitého zoznamu hodnôt, použijeme práve konštanty.

Typ správy

Ukážme si využitie vymenovaných typov na reálnom príklade. Budeme uchovávať správu pre používateľov, ktorú vygeneroval náš redakčný systém. Správa môže byť buď informačné (modrá s ikonkou i), chybové (červená s ikonkou krížika) alebo úspešná (zelená s fajkou).

K reprezentácii správy môžeme použiť obyčajné asociatívne pole, kde v kľúči bude typ správy a v hodnote jej text. Bez znalostí konštánt by sme asi použili k uchovaniu typu textový reťazec:

$zprava = array(
    'typ' => 'uspech',
    'text' => 'Článek byl publikován',
);

Takéto správe potom podľa typu priradíme CSS triedu, môžeme ich podľa typu radiť a podobne. Aby sme nemuseli premýšľať nad tým, či sme zvolili hodnotu "uspech", "uspesna" alebo "ok", urobíme si na hodnoty z výpočtu konštanty. Konštanty budú prehľadne na triede, ktorá správy spracováva a IDE nám ich bude aj napovedať:

class SpravceZprav
{
    const TYP_INFO = 0;
    const TYP_USPECH = 1;
    const TYP_CHYBA = 2;

    public function pridejZpravu($typ, $text)
    {
        . . .
}

Všetko je prehľadnejšie. Vyššie vidíte náznak triedy, ktorej metóda pridejZpravu () vytvorí pole so správou a to si uloží. Vnútorný mechanizmus som tu pre jednoduchosť zanedbal. Metóda pridejZpravu () by sa volala asi takto:

$spravceZprav = new SpravceZprav();
$spravceZprav->pridejZpravu(SpravceZprav::TYP_USPECH, 'Článek byl publikován');

Podobná trieda je naozaj použitá v seriálu o tvorbe MVC objektového redakčného systému v PHP k zobrazovania správ užívateľovi. Časom sa tam určite dostanete :)

Pozn. : Konstanty sa v starých neobjektových verziách PHP definovali pomocou funkcie define (). Takáto konštanta nepatrila žiadne triede a trpela nedostatky neobjektového programovanie, ktoré sme si spomínali v začiatkoch seriálu.

Aj budúci lekciu, Statika v PHP do tretice , budeme venovať statike, ukážeme si využitie statického databázového Wrapper, statického registra a zabavíme sa viac teoreticky o správnych a zlých využitiach triednych prvkov. Súbory z dnešnej lekcie sú ako vždy k stiahnutiu v archíve nižšie.


 

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

 

Predchádzajúci článok
Kvíz - Dátové typy, dedičnosť a polymorfizmus v PHP
Všetky články v sekcii
Objektovo orientované programovanie (OOP) v PHP
Preskočiť článok
(neodporúčame)
Statika v PHP do tretice
Č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