6. díl - Standardy jazyka PHP - PSR-4 a autoloader

PHP Standardy Standardy jazyka PHP - PSR-4 a autoloader

V minulém dílu našeho seriálu o standardech jazyka PHP jsme dokončili specifikaci PSR-3, která se zabývá logováním. Dnešní díl bude věnován PSR-4, která je zatím poslední PHP specifikací od skupiny PHP-FIG.

PSR-4 - Autoloader

PSR-4 se týká autoloadingu a vůbec způsobu pojmenovávání tříd a řazení tříd do jmenných prostorů. V typické webové aplikaci jistě používáme hned několik knihoven třetích stran. Jak by to vypadalo, kdyby si každý dělal adresářovou strukturu po svém nebo dokonce nepoužíval jmenné prostory?

Tato PSR popisuje specifikaci pro autoloading (automatické načítání) tříd ze souborů a složek. Umožňuje součinnost mezi různými systémy a může být dodatečně použita s kteroukoli jinou autoloadingovou specifikací včetně PSR-0 (což je zastaralý předchůdce PSR-4). PSR také popisuje kde ukládat soubory, které budou později načteny autoloaderem. Ukázkové použití PSR-4 je uvedeno v minulém článku, kde je kód rozdělený do jmenných prostorů a kořenovou složkou je složka vendor.

Specifikace

  1. Pojem "třída" bude referovat na třídy, rozhraní, traity a další podobné struktury.
  2. Plný název třídy (fully qualified class name) má následující podobu:
\<JmennyProstor>(\<VnoreneJmenneProstory>)*\<NazevTridy>
  • Plný název třídy MUSÍ obsahovat název jmenného prostoru nejvyšší úrovně, známý také jako "vendor namespace" (jmenný prostor výrobce).
  • Plný název třídy MŮŽE obsahovat jeden nebo více názvů vnořených jmenných prostorů.
  • Plný název třídy MUSÍ být zakončen názvem třídy.
  • Podtržítka nemají v žádné části plného názvu třídy speciální význam.
  • Abecední znaky v plném názvu třídy MOHOU být kombinací malých a velkých písmen.
  • Všechny názvy tříd MUSÍ být uváděny s ohledem na závislost na velkých a malých písmenech (case-sensitive).

Přidejme si ke specifikaci nějaký lidštější popis. Třídy dělíme do jmenných prostorů, kde první jmenný prostor označuje jméno výrobce, potom následuje libovolný počet dalších vnořených podprostorů a vše končí názvem třídy. Tedy např. ItNetwork\Clan­ky\SpravceClan­ku. Díky uvedení výrobce se aplikace zpřehlední a předejde se kolizím názvů tříd (když si 2 výrobci pojmenují třídu User a podobně)

3. Když načítáme soubor, který odpovídá plnému názvu třídy...

  • Série jednoho nebo několika počátečních jmenných prostorů a podprostorů bez úvodního oddělovače jmenných prostorů (\) v plném názvu třídy koresponduje alespoň s jednou kořenovou složkou. Tuto sérii nazýváme předpona jmenného prostoru (namespace prefix).
  • Série jmenných podprostorů za předponou koresponduje s podadresáři v kořenové složce, kdy oddělovače jmenných prostorů (\) reprezentují oddělovače adresářů (/). Názvy podsložek MUSÍ odpovídat názvům jmenných podprostorů s ohledem na velká a malá písmena.
  • Zakončující název třídy koresponduje s názvem souboru s příponou .php. Název souboru MUSÍ souhlasit s názvem třídy.

Pokud nahradíme zpětná lomítka normálními, měl by plný název třídy odpovídat cestě, kde je uložená. Z této cesty nemusí odpovídat určitá počáteční část plného názvu.

4. Implementace autoloaderu NESMÍ vyhazovat výjimky, NESMÍ vyvolávat chyby žádné úrovně a NEMĚLA BY vracet hodnotu.

Dodatek ohledně vyhazování výjimek jsem osobně nepochopil, protože pokud se autoloading nepovede, nechceme, aby aplikace dále pokračovala (což bez načtené třídy ani nemůže) a zároveň se nám velmi hodí stack trace výjimky, protože zde vidíme kde se snažíme použít neexistující třídu.

Příklady

Tabulka níže ukazuje cestu, která koresponduje a plným názvem třídy, dále předponu (namespace prefix) a kořenovou složku.

Plný název třídy Předpona Kořenová složka Výsledná cesta
\Acme\Log\Wri­ter\File_Writer Acme\Log\Writer ./acme-log-writer/lib/ ./acme-log-writer/lib/Fi­le_Writer.php
\Aura\Web\Res­ponse\Status Aura\Web /path/to/aura-web/src/ /path/to/aura-web/src/Respon­se/Status.php
\Symfony\Core\Re­quest Symfony\Core ./vendor/Symfo­ny/Core/ ./vendor/Symfo­ny/Core/Reques­t.php
\Zend\Acl Zend /usr/includes/Zend/ /usr/includes/Zen­d/Acl.php

Můžete zhlédnout oficiální příklady implementace autoloaderu podle této specifikace. Tyto ukázky NESMÍ být brány jako část specifikace a MOHOU se časem změnit. Další ukázku máte v již zmíněném minulém článku. Ohledně PHP specifikací to je zatím vše a proto se s vámi loučím :) Doufám, že se mi podařilo naučit vás novým věcem a psát standardnější a hlavně kvalitnější kód.


 

  Aktivity (1)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Celkem (5 hlasů) :
4.84.84.84.84.8


 


Miniatura
Všechny články v sekci
Standardy jazyka PHP

 

 

Komentáře

Avatar
NouF
Člen
Avatar
NouF:

Super! Máš suprové články!

 
Odpovědět  +1 31.3.2015 6:13
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 1 zpráv z 1.