IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 6 - Standardy jazyka PHP - PSR-4 a autoloader

V minulé lekci, Standardy jazyka PHP - Implementace PSR-3, jsme implementovali kód dle specifikace PSR-3, která se zabývá logováním.

Dnešní tutoriál bude věnován PSR-4, avšak nyní existuje mnohem více standardů, které si v tomto kurzu společně projdeme :)

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 článku PSR-3.

V příští lekci, Standardy jazyka PHP - PSR-6 (cachovací rozhraní), si vysvětlíme podstatu cachovacího rozhraní a některé důležité pojmy s ním související.


 

Předchozí článek
Standardy jazyka PHP - Implementace PSR-3
Všechny články v sekci
Standardy jazyka PHP
Přeskočit článek
(nedoporučujeme)
Standardy jazyka PHP - PSR-6 (cachovací rozhraní)
Článek pro vás napsal David Hartinger
Avatar
Uživatelské hodnocení:
13 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity