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.

Publikováno 10. 10. 2017
Líbil se ti článek? Napiš komentář, co si o něm myslíš: