6. diel - Štandardy jazyka PHP - PSR-4 a autoloader
V minulej lekcii, Štandardy jazyka PHP - Implementácia PSR-3 , sme dokončili špecifikáciu PSR-3, ktorá sa zaoberá logovaním. Dnešná tutoriál bude venovaný PSR-4, ktorá je zatiaľ posledný PHP špecifikácií od skupiny PHP-FIG.
PSR-4 - Autoloader
PSR-4 sa týka autoloadingu a vôbec spôsobu pomenovanie tried a radenie tried do menných priestorov. V typickej webovej aplikácii iste používame hneď niekoľko knižníc tretích strán. Ako by to vyzeralo, keby si každý robil adresárovú štruktúru po svojom alebo dokonca nepoužíval menné priestory?
Táto PSR popisuje špecifikáciu pre autoloading (automatické načítanie) tried zo súborov a priečinkov. Umožňuje súčinnosť medzi rôznymi systémami a môže byť dodatočne použitá s ktoroukoľvek inou autoloadingovou špecifikácií vrátane PSR-0 (čo je zastaraný predchodca PSR-4). PSR tiež popisuje kde ukladať súbory, ktoré budú neskôr načítané Autoloader. Ukážkové použitie PSR-4 je uvedené v minulom článku, kde je kód rozdelený do menných priestorov a koreňovú zložkou je zložka vendor.
Špecifikácia
- Pojem "trieda" bude referovať na triedy, rozhrania, Trait a ďalšie podobné štruktúry.
- Plný názov triedy (fully qualified class name) má túto podobu:
\<JmennyProstor>(\<VnoreneJmenneProstory>)*\<NazevTridy>
- Plný názov triedy MUSÍ obsahovať názov menného priestoru najvyššej úrovne, známy tiež ako "vendor namespace" (menný priestor výrobca).
- Plný názov triedy MÔŽE obsahovať jeden alebo viac názvov vnorených menných priestorov.
- Plný názov triedy MUSÍ byť zakončený názvom triedy.
- Podčiarknutia nemajú v žiadnej časti plného názvu triedy špeciálny význam.
- Abecedné znaky v plnom názve triedy MÔŽU byť kombináciou malých a veľkých písmen.
- Všetky názvy tried MUSÍ byť uvádzané s ohľadom na závislosť na veľkých a malých písmenách (case-sensitive).
Pridajme si k špecifikácii nejaký ľudskejší popis. Triedy delíme do menných priestorov, kde prvý menný priestor označuje meno výrobcu, potom nasleduje ľubovoľný počet ďalších vnorených podprostor a všetko končí názvom triedy. Teda napr. ItNetwork \ Články \ SpravceClanku. Vďaka uvedeniu výrobca sa aplikácia sprehľadní a predíde sa kolíziám názvov tried (keď si 2 výrobcovia pomenujú triedu User a podobne)
3. Keď načítame súbor, ktorý zodpovedá plnému názvu triedy ...
- Séria jedného alebo viacerých počiatočných menných priestorov a podprostor bez úvodného oddeľovača menných priestorov (\) v plnom názve triedy korešponduje aspoň s jednou koreňovou zložkou. Túto sériu nazývame predpona menného priestoru (namespace prefix).
- Séria menných podprostor za predponou korešponduje s podadresári v koreňovom priečinku, kedy oddeľovača menných priestorov (\) reprezentujú oddeľovača adresárov (/). Názvy podpriečinkov MUSÍ zodpovedať názvami menných podprostor s ohľadom na veľké a malé písmená.
- Zakončujúca názov triedy korešponduje s názvom súboru s príponou .php. Názov súboru MUSÍ súhlasiť s názvom triedy.
Ak nahradíme spätné lomítka normálnymi, mal by plný názov triedy odpovedať ceste, kde je uložená. Z tejto cesty nemusí zodpovedať určitá počiatočná časť plného názvu.
4. Implementácia Autoloader NESMIE vyhadzovať výnimky, NESMIE vyvolávať chyby žiadne úrovne a NEMALA BY vracať hodnotu.
Dodatok ohľadom vyhadzovanie výnimiek som osobne nepochopil, pretože ak sa autoloading nepodarí, nechceme, aby aplikácia ďalej pokračovala (čo bez načítanej triedy ani nemôže) a zároveň sa nám veľmi hodí stack trace výnimky, pretože tu vidíme kde sa snažíme použiť neexistujúci triedu.
Príklady
Tabuľka nižšie ukazuje cestu, ktorá korešponduje a plným názvom triedy, ďalej predponu (namespace prefix) a koreňovú zložku.
Plný názov triedy | predpona | koreňová zložka | výsledná cesta |
---|---|---|---|
\ Acme \ Log \ Writer \ File_Writer | Acme \ Log \ Writer | ./acme-log-writer/lib/ | ./acme-log-writer/lib/File_Writer.php |
\ Aura \ Web \ Response \ Status | Aura \ Web | / Path / to / aura-web / src / | /path/to/aura-web/src/Response/Status.php |
\ Symfony \ Core \ Request | Symfony \ Core | ./vendor/Symfony/Core/ | ./vendor/Symfony/Core/Request.php |
\ Zend \ Acl | Zend | / Usr / includes / Zend / | /usr/includes/Zend/Acl.php |
V budúcej lekcii, Štandardy jazyka PHP - PSR-6 (cachovací rozhranie) , si vysvetlíme podstatu cachovacího rozhranie a niektoré dôležité pojmy s ním súvisiace.