Nevíte jakým způsobem dávat názvy metodám, jak rozdělit kód do souborů apod. ? Kód by měl být rozdělen do více souborů, v dnešní době není problém s výkonem CPU, takže se nemusíte bát, že bude takový kód pomalejší. PHP nemá žádný kompilátor jako např. Java a snadno se udělá chyba, na kterou se nepřijde. Pokud budeme tvořit aplikaci, určitě budeme chtít použít již napsané kódy např. z Github. To může být problém, pokud nebudeme dodržovat určité standardy. PHP žádné oficiální standardy nemá, ale za oficiální sbírku standardů můžeme používat to, co vytváří skupina autorů největších frameworků (Zend, Symfony, PHPCake, Laravel apod.) pod názvem PHP FIG.
Standardy nebudu podrobně rozepisovat, jen si tady vypíšu to nejdůležitější z PSR-1, PSR-2 (popisuje styl psaní kódu).
Základ standartního kódování PSR-1
- nesmí se používat ukončovací znaky PHP ?> na konci php souboru (snadno se může udělat chyba, že za ukončením zapomeneme prázdný řádek, který zamezí použití fce header()
- nemělo by se používat <? na začátku PHP kódu (tzv. short tag), pouze <?php nebo <?=
- každá třída musí být v samostatném souboru
- všechny PHP soubory musí být v kódování UTF-8
- neměli bychom v jednom souboru definovat funkce a zároveň je spouštět
- každý namespace musí začínat jménem autora (vendor)
- konstanty ve třídách musí být deklarovány velkými písmeny a s podtržítky
- metody musí být deklarovány v camelCase()
Styl psaní kódu PSR-2
- řádky by neměly být delší než 80 znaků
- za účelem vyšší čitelnosti mohou být použity prázdné řádky
- na řádku nesmí být více než jeden příkaz
- 4 mezery pro odsazení
- konstanty true, false a null musí být malými písmeny
- za namespace musí být prázdná řádka
- složené závorky {} na začátku a konci třídy musí být na samostatném řádku
- pokud se seznam implementovaných rozhraní nevejde na jeden řádek, musí být na samostatném řádku včetně prvního (platí i pro argumenty v metodách)
- jeden příkaz nesmí deklarovat více než jednu vlastnost (např. public $kod, $nazev; nesmí být, nedalo by se dokumentovat)
- při deklaraci vlastností nepoužívat prefix podtržítko (dříve se používalo v PHP, když ještě neexistoval modifikátor přístupu private)
- u metod musí být deklarována viditelnost
- v seznamu argumentů nesmí být před čárkou mezera a za každou čárkou musí být mezera
- argumenty s výchozí hodnotou musí být deklarovány jako poslední
- klíčová slova abstract a final musít být deklarovány před viditelností, static musí být za viditelností (např. final public static function)
- tělo podmínky i s jediným příkazem musíme vkládat do složených závorek (aby se předešlo chybám při vkládání dalších příkazů)
- místo else if bychom měli používat elseif (jednoslovný příkaz)
- u switch musí být case odsazen, stejně tak break, pokud chybí break, musíme propadávání podmínky popsat v komentáři
Logovací rozhraní PSR-3
- LoggerInterface vystaví 8 metod pro zápisování logů na 8 úrovních debug, info, notice, warning, error, critical, alert a emergency
- 9. metoda log() má v prvním argumentu úroveň logu
Autoloader PSR-4
Specifikace autoloadingu tříd. Jméno třídy má tvar: \<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>. Jako autoloader používám v projektech composer, který PSR-4 zná, zatím nebudu více rozepisovat.
Kešovací rozhraní PSR-6
Základní cesta ke zrychlení projektu.
- volání knihovny
- implementace knihovny (Cache\CacheItemPoolInterface a Cache\CacheItemInterface)
- TTL (počet sekund nebo DateInterval)
- expirace (čas vypršení platnosti)
- klíč (max. 64 znaků)
- hit (zda klíč existuje)
- miss (opak hit)
- odložení
HTTP zpráva rozhraní (PSR-7)
Popisuje rozhraní pro požadavky a odpovědi HTTP zpráv. Tato rozhraní podporují všechny známé frameworky, na posílání HTTP zpráv je asi nejlepší knihovna Guzzle (umí asynchronní odesílání zpráv).
Kontejner rozhraní (PSR-11)
Cílem ContainerInterface je standard pro práci s objekty a parametry (entries) v kontejneru. Pro čtení jsou metody get a has.
- get vrací cokoliv (mixed) nebo háže podmínku NotFoundExceptionInterface
- has vrací true nebo false
Doporučuje se nepředávat kontejner do objektu tak, že by objekt mohl načíst své vlastní závislosti. To by znamenalo využití kontejneru v podobě návrhového vzoru Service Locator, což je návrhový vzor, kterýmu je lepší se vyhnout.
Odkazy definující rozhraní (PSR-13)
Odkazy jsou základní esencí webových stránek. Termín Hypertext byl rozšířen na termín Hypermedia. Toto PSR se snaží zjednodušit způsob reprezentace odkazů nezávisle na formátu serializace. Je na to hodně referencí. Hypermedia link se skládá z URI (reference na cílový zdroj) a vztah definující jak cíl souvisí se zdrojem.
LinkInterface definuje metodu getHref(), která vrací buďto absolutní URI nebo relativní URI. Metoda getRels() vrací seznam vztahů. Metoda isTemplated() vrací true pokud se jedná o šablonovaný odkaz nebo false. Šablonované odkazy mají jeden nebo více {variable} zástupců, které mohou klienti vyplnit do tvaru plně kvalifikované URI. Metoda getAttributes() vrací seznam atributů odkazu.
LinkInterface má několik rozšíření.
- EvolveLinkInterface přidává k základu metody vracející odkaz např. withHref() s konkrétní URI, withRel() s konkrétním vztahem nebo naopak bez atributu či vztahu
- LinkProviderInterface přidává metody getLinks() a getLinksByRel(), může vracet pole nebo nějaký \Traversable object.
- EvolvableLinkProviderInterface rozšiřuje LinkProviderInterface o metody withLink() a withoutLink()
HTTP Server request obsluha (PSR-15)
PSR popisuje základní rozhraní pro obsluhy požadavků HTTP serverů. Souvisí s PSR-7.
Obsluha požadavku (request handler) je proces zpracování požadavku a vrácení odpověďi (response) definované v PSR-7.
- Obsluha musí mít definovanou metodu handle() implementovanou v rozhraní RequestHandlerInterface
- Middleware je infrastruktura umožňující tvorbu podnikových aplikací. Poskytuje aplikacím služby nad rámec. Musí mít definovanou metodu process(), kterou implementuje rozhraní MiddlewareInterface
Základní rozhraní pro kešování knihoven (PSR-16)
HTTP továrničky (PSR-17)