Najnovšie na Twitteri
    sledujte môj Twitter
    Moje projekty

    Prekladové mapy v PHP

    Publikované: 21.08.2009 19:41 | Zobrazené: 531x

    Povedzme, že robíme stránku predávajúcu malinovku. Majme konfiguračný súbor a v ňom definované číselné konštanty identifikujúce druhy malinoviek.

    <?php
    define('MALINOVKA_CERVENA',                      1);
    define('MALINOVKA_ZELENA',                       2);
    define('MALINOVKA_ZLTA',                         3);
    define('MALINOVKA_BIELA',                        4);
    ?>

    S týmito konštantami bežne pracujeme. Ale jedného dňa potrebujeme iterovať cez všetky typy malinoviek a každej vypísať názov. Čo s tým? Za tie roky, čo robím s PHP a prichádzam do styku s rôznymi programátormi som vypozoroval, že nie každý sa vie s týmto triviálnym problémom popasovať. Až príliš časté riešenie vyzerá nejako podobne tomuto:

    <?php
    # pridanie do configu
    define('MALINOVKA_CERVENA_NAZOV',                'cervena');
    define('MALINOVKA_ZELENA_NAZOV,',                'zelena');
    define('MALINOVKA_ZLTA_NAZOV',                   'zlta');
    define('MALINOVKA_BIELA_NAZOV',                  'biela');
     
    # a v inom subore
     
    echo '<input type="radio" name="malinovka" value="' . MALINOVKA_CERVENA . '">' . MALINOVKA_CERVENA_NAZOV . "<br />";
    echo '<input type="radio" name="malinovka" value="' . MALINOVKA_ZELENA . '">' . MALINOVKA_ZELENA_NAZOV . "<br />";
    echo '<input type="radio" name="malinovka" value="' . MALINOVKA_ZLTA . '">' . MALINOVKA_ZLTA_NAZOV . "<br />";
    echo '<input type="radio" name="malinovka" value="' . MALINOVKA_BIELA . '">' . MALINOVKA_BIELA_NAZOV . "<br />";
    ?>

    Naozaj ma prekvapuje veľká frekvencia výskytov uvedených riešení. Pritom je to jednoduché a stačí siahnuť po tzv. prekladovej mape a vložiť konštanty do poľa.

    <?php
     
    # prekladová mapa nie je nič iné, než obyčajné asociatívne pole
     
    $malinovky = array(
        MALINOVKA_CERVENA => MALINOVKA_CERVENA_NAZOV,
        MALINOVKA_ZELENA  => MALINOVKA_ZELENA_NAZOV,
        MALINOVKA_ZLTA    => MALINOVKA_ZLTA_NAZOV,
        MALINOVKA_BIELA   => MALINOVKA_BIELA_NAZOV,
    );
     
    # použitie
     
    foreach ($malinovky as $typ => $nazov) {
        echo '<input type="radio" name="malinovka" value="' . $typ . '">' . $nazov . '<br />";
    }
    ?>

    Problém prekladovej mapy je, že je to premenná. Kým konštanty sú globálne dostupné, tak prekladová mapa nie je. K tomuto však už pristupujeme podľa potrieb konkrétnej aplikácie. Môžeme si napríklad vytvoriť triedu so statickou premennou. (Pozor, je to elegantné a zároveň škaredé riešenie, v podstate sa totiž jedná o simuláciu globálnej premennej).

    <?php
     
    class Malinovky {
        protected static $druhy = array(
            MALINOVKA_CERVENA => MALINOVKA_CERVENA_NAZOV,
            MALINOVKA_ZELENA  => MALINOVKA_ZELENA_NAZOV,
            MALINOVKA_ZLTA    => MALINOVKA_ZLTA_NAZOV,
            MALINOVKA_BIELA   => MALINOVKA_BIELA_NAZOV,
        );
     
        public static dajDruhy() {
            return self::$druhy;
        }
    }
     
    # neskôr hocikde v kóde používame
     
    foreach (Malinovky::dajDruhy() as $typ => $nazov) {
        echo '<input type="radio" name="malinovka" value="' . $typ . '">' . $nazov . '<br />";
    }
     
    ?>

    Ak patríte medzi náročných (alebo pohodlných) programátorov, tak si triedu Malinovky napíšete tak, aby implementovala interface Iterator.

    Prekladové mapy sú jednoduché a účinné riešenie a je zaujímavé, že tak veľa pomerne dobrých programátorov ich nepoužíva. Dúfam, že tento článok napomôže zníženiu ich počtu.

    Pošli na: Facebook   vybrali.sme.sk
    Komentáre:

    Zatiaľ nie sú žiadne komentáre.

    Pridať komentár