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

    Novinky v PHP 5.3

    Publikované: 08.06.2009 19:03 | Zobrazené: 1792x

    Deprecated magic_quotes_gpc

    Jednou z najočakávanejších zmien v jazyku PHP je vyhodenie konfiguračných direktív magic_quotes_gpc, register_globals, safe_mode a ich príbuzných. Toto by sa malo stať v PHP 6. Prvé kroky boli urobené už v PHP 5.3, kde sú tieto direktívy označené za zastarané (deprecated) a defaultne vypnuté.

    Osobne tieto zmeny veľmi vítam. Uvidíme, aký dopad to bude mať na bezpečnosť aplikácií vyvíjaných lamkami a či sa tieto konečne naučia niečo o tom, ako písať bezpečný kód.

    Deprecated ereg funkcie

    Kto sa ešte nenaučil pracovať so skutočnými regulárnymi výrazmi (tj. tými perlovskými), mal by to rýchlo dohnať. Všetky ereg funkcie sa totiž v novom PHP stávajú zastarané a ich použitie vyvolá chybu E_DEPRECATED. Perlovské regulárne výrazy už navyše nie je možné vypnúť.

    Nový natívny MySQL driver

    Pri kompilovaní PHP si môžete teraz zvoliť používanie knižnice mysqlnd namiesto libmysql. Aké to prinesie výhody? Zvýši sa rýchlosť a celková výkonnosť niektorých funkcií pre prácu s MySQL, nové PHP sa bude jednoduchšie kompilovať (nebude potrebné linkovať libmysql) a v neposlednom rade je mysqlnd licencované rovnakou licenciou ako PHP.

    Ternárny operátor

    O zmenách týkajúcich sa vyhodnocovania ternárneho operátora som už raz písal, tak len v skratke. Po novom je možné úplne vynechať kladnú vetvu vyhodnocovania. V prípade jej neuvedenia bude návratovou hodnotou vyhodnovovaný výraz. Vyskúšajte si:

    <?php
     
    var_dump(0 ? : 'hello');
    var_dump(1 ? : 'hello');
     
    ?>

    Phar

    Phar je názov PECL rozšírenia, ktoré umožňuje mať celú PHP aplikáciu uloženú v jednom jedinom súbore, odkiaľ je možné ju priamo spúšťať (prípadne pristupovať k jej jednotlivým súborom). V novom PHP sa toto rozšírenie presunulo z PECL archívu a stalo sa priamou súčasťou PHP.

    Namespaces - Priestory mien

    Na pridanie priestorov mien do PHP čakali niektorí vývojári ako na mannu z nebies. Teraz si môžu pochutnať, PHP 5.3 totiž zavádza priestory mien. Pri ich používaní si treba dávať pozor na to, že keď definujete nový priestor mien, tak príkaz namespace musí byť prvý vo vašom skripte.

    Mne osobne a množstvu ďalších vývojárov sa na priestoroch mien v PHP nepáči jedna vec, namespace-y a sub-namespace-y sa oddeľujú pomocou spätného lomítka. Bŕŕŕ.

    <?php
     
    namespace projektpouzivateliaopravnenia;
     
    const foo = 1;
    class bar { /* ... */ }
     
    ?>

    Anonymné funkcie

    Uvedenie anonymných (alebo lambda) funkcií je jednou z väčších noviniek, ktorá zrejme bude mať čiastočný dopad na štýl programovania a trochu výzorovo zelegantní váš kód. Zrejme najčastejšie bude ich využitie ako callbackov pre funkcie na triedenie, filtrovanie a matchovanie.

    Keď sme napríklad v minulosti chceli nad každým prvkom poľa zavolať nejakú funkciu, museli sme si vytvoriť špeciálnu funkciu, asi takto:

    <?php
     
    $pole = array('jablko', 'hruska', 'slivka');
     
    function prve_velke($_str) {
        $str{0} = strtoupper($str{0});
        return $str;
    }
     
    $velke = array_map('prve_velke', $pole);
     
    ?>

    Daný príklad je ešte celkom fajn, dása to totiž aj inak: funkciou create_function, ktorá ma škaredú syntax, zlú výkonnosť a pridá veľmi zle čitateľné časti do vášho kódu. Teraz však na ňu môžeme zabudnúť. Po novom to totiž môžeme urobiť takto:

    <?php
     
    $pole = array('jablko', 'hruska', 'slivka');
     
    $velke = array_map(
        function($_str) {
            $_str{0} = strtoupper($_str{0});
            return $_str;
        },
        $pole
    );
     
    ?>

    Anonymné funkcie sú vnútorne implementované pomocou triedy Closure.

    Closures

    O niečo viac možností ako anonymné funkcie pridávajú closures. Videl som niekoľko blogpostov od matematikov, ktorí sa nadchýnali tým, čo s closures dokážu urobiť a predvádzali ich možnosti na fascinujúcich príkladoch, ktorým som sotva rozumel :) Vysvetlenie pre bežných ľudí: closures sú anonymné funkcie, ktoré si môžu pamätať jednu alebo viac premenných a ich hodnôt aktuálne dostupných v kontexte, v ktorom boli closures vytvárané. Zložité? Tu je príklad:

    <?php
     
    $a = "a";
     
    $closure = function() use ($a) {
      echo $a;
    };
     
    $a = "b";
     
    $closure();
     
    ?>

    Vo výsledku uvidíte na výpise 'a'. To preto, lebo v čase vytvárania closure mala premenná $a práve takú hodnotu. V dobe volania closure funkcie už daná premenná nielenže nemusí byť dostupná v rámci aktuálneho kontextu, mať inú hodnotu, ale dokonca nemusí ani existovať.

    Closure môže premenné naviazané z kontextu aj modifikovať, pokiaľ pred ich názov v klauzule use uvedieme ampersand.

    <?php
     
    $a = "a";
     
    $closure = function() use (&$a) {
      echo $a;
      $a = "c";
      echo $a;
    };
     
    $a = "b";
     
    $closure();
     
    echo $a;
     
    # Vo výsledku uvidíte na výpise 'aacc'
     
    ?>

    Ak by sme v tomto prípade pred volaním $closure() zrušili premennú $a, tak dostaneme chybovú hlášku typu E_NOTICE o nedefinovanej premennej.

    Pokiaľ closures vytvárame v rámci objektu, tak majú automatický prístup k aktuálnej inštancii pomocou $this.

    Záver

    PHP 5.3 prináša do tohto jazyka najväčšie zmeny od uvedenia PHP 5 a čiastočne pripravuje pôdu pre PHP 6. Nutno podotknúť, že zmeny sú zväčša len k lepšiemu, nešťastné bolo snáď len rozhodnutie použiť spätné lomítko ako oddelovač pre priestory mien. Po dlhom čase boli vyslyšané prosby odbornej komunity a bol urobený dôležitý krok smerom k odstráneniu magic_quotes_gpc, safe_mode a register_globals. Closures a ich špeciálny prípad, anonymné funkcie, prinesú trošku viac čitateľnosti, elegantnosti a nových možností. Ja sa nové PHP celkom teším a čo vy?

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

    Zatiaľ nie sú žiadne komentáre.

    Pridať komentár