PSR-4
Co se skrývá pod magickým termínem PSR-4?
PSR
PSR jsou ve zkratce standardy pro jazyk PHP. Jsou očíslované od nuly do zatím nejvyššího čísla šestnáct. Jejich seznam lze najít na php-fig.org/psr. Dodržovat je není povinné, ale vyplatí se nad jejich zavedením do projektů alespoň zauvažovat.
Ze zajímavých doporučuji načíst standardy PSR-3 o logování, PSR-7 o HTTP Message Interface, draft PSR-5 o PHPDoc a hlavně PSR-4 o autoloadingu, o kterém je i tento článek.
PSR-4
PSR-4 se zabývá autoloadingem, tedy jak automaticky načítat použité třídy. Definuje také, jak tyto třídy mají být zařazeny v namespaces a jaká má být adresářová struktura aplikace.
Můžeš narazit i na standard PSR-0, který se také zabývá autoloadingem. Řešil to samé a nyní je označený jako deprecated (zastaralý nebo překonaný), doporučuji se držet PSR-4.
Výhody
Pokud celý projekt včetně cizích knihoven používá PSR-4, můžeš použít jeden autoloader pro veškerý kód. Přidání knihovny neznamená žádný kód pro její zavádění; autoloader už podle standardu ví, kde knihonu najít. Navíc nemusíš používat žádné require_once()
, takže se nemůže stát, že bys zapomněl nějaký kus kódu do aplikace zahrnout.
Při pohledu na cizí kód používající tento standard hned víš, kde se daná knihovna ve složkách nachází.
A aplikace používající PSR-4 lze přes Composer použít bez problémů v jakékoliv jiné aplikaci. Stačí ji publikovat na packagist.org, spustit příkaz composer require [autor]/[balíček]
a můžeš novinku hned začít používat.
Nevýhody
PSR-4 sebou nese i nevýhody. Při dodržování tohoto standardu je třeba přísně držet strukturu složek v projektu, což nemusí vyhovovat každému. Při jeho použití se také špatně do projektu přidává cizí kód, protože PSR-4 projekt má pouze jeden autoloader a pro další kód je třeba extra řešit jeho nahrávání.
Adresářová struktura
Podle PSR-4 musí být každá část kódu zapouzdřena v nějaké třídě. Každá tato třída musí být v samostatném souboru pojmenovaném stejně jako daná třída.
Každá třída musí náležet do nějakého namespace (jmenného prostoru). Namespace zároveň určuje, v jaké složce se soubor se třídou musí nacházet.
Pro ujasnění malý příklad: mějme soubor s názvem Foo.php
s následujícím obsahem:
<?php
namespace ApplicationOne;
class Foo {
//... content
}
Soubor se musí jmenovat stejně jako třída a patří do složky ApplicationOne
, protože je v namespace ApplicationOne
. Může obsahovat jen tuto třídu a nic jiného.
Namespaces lze i vnořovat; bude li tedy třída mít namespace ApplicationOne\ModuleUser
a bude se jmenovat UserDatabaseHandler
, soubor s ní by se měl jmenovat UserDatabaseHandler.php
a být zanořen ve složce ApplicationOne/ModuleUser
.
Pozor - jako většina PHP jsou i namespaces citlivé na velikost písmen (case-sensitive)!
Používání ve frameworcích
PSR-4 implementuje několik frameworků, například Zend či Symfony. Vyplatí se zjistit si, zda se tento standard užívá i ve tvém oblíbeném frameworku.
Zprovoznění
Pro použití standardu PSR-4 je více než vhodné mít Composer (sepsal jsem návod).
Jestliže vezmeš minulý příklad s namespace ApplicationOne
a soubory chceš ukládat do složky app
, do souboru composer.json
přidej následující kód:
"autoload": {
"psr-4": {
"ApplicationOne\\": "app/"
}
}
Tento kód označuje, že když bude aplikace hledat třídu Bar
v namespace ApplicationOne
, má ji hledat s souboru app/Bar.php
. Tímto způsobem nemusíš mít složku pojmenovanou jako hlavní namespace (typicky názvem aplikace), ale rozumně jako třeba src
nebo app
. Těchto mappingů můžeš mít i více, v praxi se to ale příliš nepoužívá.
Na začátek aplikace stačí přidat require __DIR__ . '/vendor/autoload.php';
pro automatický autoload vendor složky, a máme aplikaci na PSR-4 zprovozněnou.
Další četba
Přeložený PSR-4 do češtiny najdeš třeba na itnetwork.cz. Pěkný článek o autoloadingu pomocí PSR-4 v Composeru najdeš na PhpEnthusiast. Rozdíl mezi starým PSR-0 a současným PSR-4 najdeš tradičně na stackoverflow.
Too Long, Didn’t Read?
PSR-4 je standard pro jazyk PHP týkající se autoloadingu tříd. Není povinný pro dodržování, ale je to více než vhodné. Pokud všechny balíčky dodržují standard PSR-4, lze je bez obav používat bez konfliktů vedle sebe.