10. diel - Triedny prvky v PHP druhýkrát - konštanty
V predchádzajúcom kvíze, Kvíz - Dátové typy, dedičnosť a polymorfizmus v PHP, sme si overili nadobudnuté skúsenosti z predchádzajúcich lekcií.
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:
{PHP} require_once('tridy/Clovek.php'); require_once('tridy/Javista.php'); mb_internal_encoding("UTF-8"); $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ů');
{PHP} 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); } }
{PHP} 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ť:
{PHP} require_once('tridy/Matematika.php'); $polomer = 5; $obsah = Matematika::PI * Matematika::naDruhou($polomer); echo("Obsah kruhu je $obsah cm<sup>2</sup>.");
{PHP} class Matematika { const PI = 3.14159265358979; public static function naDruhou($zaklad) { return $zaklad *$zaklad; } }
výsledok:
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é 869x (5.23 kB)
Aplikácia je vrátane zdrojových kódov v jazyku PHP