Novinky v PHP 5.3
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:
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ŕŕŕ.
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:
$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:
$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:
$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.
$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?
Nová stabilná verzia PHP s označením 5.3 je predo dvermi a každý serióznejší
PHP programátor by už mal byť oboznámený so všetkými zmenami, ktoré prinesie.
Pre tých, ktorí si zatiaľ nestihli nové PHP naštudovať, alebo nebodaj aj pre tých,
čo nevedia, že nová verzia je na spadnutie, prinášam prehľad podľa mňa najzaujímavejších zmien.
Zatiaľ nie sú žiadne komentáre.