Dne 30. června 2009 byla vydána nová verze PHP 5.3. Obecně, vyjde-li nová verze programovacího jazyka, může to v lidech (programátorech) vyvolávat rozporuplné reakce. Buď se na to těšili a očekávají rozšíření možnosti programovacího jazyka a tudíž i možnost vytvářet lepší a dokonalejší programové kódy, a nebo mají strach, jestli se novým možnostem dokáží snadno přizpůsobit. Já osobně rozhodně patřím do první skupiny a jelikož se jedná o můj oblíbený skriptovací jazyk a je do značné míry rozšířen coby jazykem dynamických webových aplikací, je mou povinností sepsat o této novince pár článků.
Co mě nejdříve zarazilo je verze samotného PHP. Leckdo (i já) čekal, že další verze se bude honosit číslovkou 6, nicméně si lidé z developerského týmu nejspíš řekli, že tolik novinek do této vypuštěné verze nebylo přidáno, proto verze 5.3. Nicméně si osobně myslím, že novinek je hodně, jmenujme hlavní jako např. jmenné prostory, late static binding a další. Sice již přesně nedokážu říci, jaké hlavní rozdíly byly mezi PHP 4 a PHP 5 (snad kromě vyšší podpory objektového programování), ale myslím si, že už jen jmenné prostory posouvají PHP 5.3 o řád výše oproti PHP 5.2.x. No, necháme polemizování, oni developeři PHPčka zřejmě vědí, co dělají :-). Raději se budu věnovat výčtu těch hlavních novinek, které nám nova verze přináší. Nejprve se zaměřím na podle mě hlavní novou funkci a sice jmenné prostory.
Jmenné prostory
Jedná z důležitých věcí, která již dlouho chyběla v PHP, nyní je konečně tady. Již končí doba, kdy bylo nutno vymýšlet stále nová jména pro funkce/třídy ale i konstanty. Nyní stačí skupinu souvisejících tříd přidat do nějakého jmenného prostoru a tímto je možné mít i stejné názvy funkcí/tříd, samozřejmě oddělené jmenným prostorem. Tohle je samozřejmě nejedná super výhoda jmenných prostorů, ale co to vlastně je ten jmenný prostor.
Ti co znají programovací jazyky jako JAVA, či C# nemusím poučovat, ale pro ty ostatní: jmenný prostor si můžeme představit jako „adresář“, kde budeme ukládat jednotlivé funkce/třídy a konstanty. Tímto se tyto funkce/třídy zakonzervují a jsou přístupné v daném „adresáři“. Tak jako normální adresáře souborového systému, tak i jmenné prostory můžeme zařazovat do podadresářů, takže nám může vzniknou jmenný prostor např. obchod\kosik\polozka.
Jmenné prostory se v PHP deklarují klíčovým slovem namespace. Tato deklarace však musí být v souboru umístěna hned jako první příkaz, a to i před jakýmkoliv ne PHPčkovským výpisem. Jedinou výjimkou je příkaz declare, kterým je možné si nastavit spouštěcí direktivy pro blok kódu. Samozřejmostí je možnost rozdělit kód do více souborů a vždy na tento soubor přiřadit stejný jmenný prostor. V jednom souboru je také možné deklarovat i více jmenných prostorů, ale tato možnost je z hlediska přehlednosti kódu dosti nevyužívaná. Když už je nutno vytvořit v jednom souboru dva a více jmenných prostorů, je možné je pro přehlednost alespoň uzavřít do složených závorek ( { a } ).
Volání funkcí/tříd z jmenného prostoru je možné 3 způsoby:
- Nekvalifikovaným jménem – tedy jménem samotné funkce/třídy, pokud se daná fukce/třída nachází ve jménem prostoru, ze kterého je funkce/třída volána.
- Kvalifikovaným jménem – pokud chceme volat funkce/třídu, která je v sub jmenném prostoru, daného jmenného prostoru, odkud je třída/funkce volána, tak jednoduše použijeme konstrukcti subjmennyprostor\funkce(), nebo dále i subjmennyprostor/dalsijmennyprostor\funkce(), atd.
- Plně kvalifikovaným jménem – pokud chceme volat funkci/třídu z jiného jmenného prostoru, než se právě teď nacházíme, použijeme konstrukci \jmennyprostor\dalsijmennyprostor\funkce().
Výše uvedenou třetí možností se prakticky dá volat jakákoliv funkce/metoda, ovšem zápis se tím hodně prodlužuje. Jen si zkuste každou fukci/třídu třídu volat plně kvalifikovaným jménem. Jednak to velmi nepraktické a jednak nám to stěžuje čitelnost kódu (i když s tou čitelností, alespoň přesně víme, jakou funkci/třídu voláme :). Proto je v PHP přidána možnost ( pomocí klíčového slova „use“)„inkludnout“ si jednotlivé jmenné prostory pod určitým aliasem (nebo i bez něj) a na tyto funkce/třídy v těchto jmenných prostorech se odkazovat nekvalifikovaným jménem.
Pokud například vložíme příkaz:
use mujprostor/subprostor;
můžeme se tak na funkce/třídy obsažené v mujprostor/subprostor odkazovat nekvalifikovaným jménem, např:
$o = new tridaVSubprostor();
Příkaz „use“ se také používá pro aliasy, jako např:
use mujprostor/subprostor/MyClass as mojeTrida;
$o = new mojeTrida(); // vytvori se objekt mujprostor/subprostor/MyClass
Jak je vidět, jmenné prostory nabízejí jednoduchou funkcionalitu a lze je jednoduše pochopit jako adresářovou strukturu definovaných funkcí/tříd a konstant, která nám nabízí možnost využívat vícekrát zavedené názvy funkcí/tříd v rámci jednoho projektu. V příštích článcích se dále podíváme na late static binding a další nové možnosti PHP.