Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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 2 - Standardy jazyka PHP - PSR-2 část první

V minulé lekci, Standardy jazyka PHP - Úvod a PSR-1, jsme si uvedli standard PSR-1, který definoval jak vytvářet PHP soubory a jak pojmenovávat třídní prvky.

V dnešním tutoriálu se zaměříme na standard PSR-2.

PSR-2 rozšiřuje PSR-1 a předepisuje další konvence pro psaní PHP kódu. Tento standard nese název Příručka stylu psaní kódu (Coding Style Guide). Stejně jako minulý standard vznikl shodou autorů několika velkých (opravdu velkých) PHP projektů.

Standard PSR-2 byl v roce 2019 označen jako zastaralý. Jeho místo zaujímá standard PSR-12 a také ho rozšiřuje.

Obecné

Standard popisuje styl psaní kódu. Třída by měla vypadat asi takto:

<?php
namespace Vendor\Package;

use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

class Foo extends Bar implements FooInterface
{
    public function sampleFunction($a, $b = null)
    {
        if ($a === $b) {
            bar();
        } elseif ($a > $b) {
            $foo->bar($arg1);
        } else {
            BazClass::bar($arg2, $arg3);
        }
    }

    final public static function bar()
    {
        // tělo metody
    }
}

Základní standard

Kód MUSÍ splňovat základní standard PSR-1.

Soubory

Všechny soubory MUSÍ zakončovat řádky znakem Unix LF.

Různé konce řádků mohou na serveru vyvolat obrovské problémy. A to zejména když je server nastavený na jiné konce řádků, než soubory na něm uložené. Pokud se např. rozbije odřádkování za komentářem //, zakomentuje hned několik řádku po sobě. Sofistikované nástroje pro upload souborů na FTP konce řádků převádějí podle serveru (např. ITnetwork běží na MACu). Protože je většina serverů Linuxových, přikazuje standard používat všude jednotný znak (LF je \n, ASCII kód 10).

Všechny PHP soubory MUSÍ končit prázdným řádkem.

Zakončit každý řádek znakem LF (i ten poslední) je dobrá praktika nejen u zdrojových souborů, vyhneme se tak např. problémům při jejich spojování.

Ukončovací tag ?> MUSÍ být vypuštěn u souborů, které obsahují pouze PHP kód.

Pokud deklarujeme třídu, vypadá její soubor pouze takto:

<?php
namespace Vendor\Foo;

class Foo
{

}

Pokud PHP direktivu neukončíme, platí do konce souboru. Ukončovat ji u souborů s deklarací je špatná praktika, jelikož se nám mezi ?> a konec souboru mohou vloudit další znaky a ty by potom mohly při načtení (require/include) vyvolat HTML výstup a odeslání hlaviček. To by zamezilo např. použití funkce header().

Řádky

Na délku řádku NESMÍ být žádný pevný limit.

Na délku řádku MUSÍ být volný limit (soft limit) 120 znaků.

Volný limit je délka řádku, jejíž překročení vyvolá upozornění, ale nijak neovlivní běh aplikace.

Řádky by NEMĚLY být delší než 80 znaků. Delší řádky by MĚLY být rozdělené do více řádek, kratších než 80 znaků.

Pozn. 80 znaků je šířka obrazovky ve výchozím textovém režimu.

Na konci neprázdných řádku NESMÍ být mezera.

Za účelem zvýšení čitelnosti MOHOU být přidány prázdné řádky.

Na řádce NESMÍ být více než jeden příkaz.

Odsazování

Kód MUSÍ používat pro odsazení 4 mezery a NESMÍ používat tabulátory.

Mezery jsou na rozdíl od tabulátorů univerzální a nezáleží na nastavení editoru. Tabulátory často matou verzovací nástroje, diffy a další podobné aplikace.

Klíčová slova a true/ false, null

Klíčová slova PHP MUSÍ být malými písmeny.

Konstanty true, false a null MUSÍ být malými písmeny.

Jmenné prostory a deklarace use

Pokud je uveden jmenný prostor, MUSÍ být za namespace prázdná řádka.

Všechny use deklarace MUSÍ následovat za deklarací namespace.

Každá deklarace MUSÍ obsahovat právě jedno klíčové slovo use.

Za blokem use MUSÍ být prázdná řádka.

Příklad ze standardu:

<?php
namespace Vendor\Package;

use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

// další PHP kód

Třídy, vlastnosti a metody

Termín třída bude opět referovat nejen na třídy, ale i na rozhraní a traits.

Extends a Implements

Klíčová slova extends a implements MUSÍ být deklarovaná na stejné řádce, jako třída.

Levá složená závorka za class MUSÍ být na samostatném řádku. Pravá složená závorka MUSÍ být také na samostatném řádku po těle třídy.

<?php
namespace Vendor\Package;

use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

class ClassName extends ParentClass implements \ArrayAccess, \Countable
{
    // konstanty, vlastnosti, metody
}

Seznam rozhraní k implementaci MŮŽE být rozdělen na více řádek, řádky poté jednou odsadíme. Pokud tak učiníme, každé rozhraní MUSÍ být na samostatném řádku včetně prvního.

<?php
namespace Vendor\Package;

use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

class ClassName extends ParentClass implements
    \ArrayAccess,
    \Countable,
    \Serializable
{
    // konstanty, vlastnosti, metody
}

Vlastnosti

U všech vlastností MUSÍ být deklarována viditelnost (modifikátor přístupu).

Každý jazyk má jako výchozí jiný modifikátor. Vlastnost bez modifikátoru je např. v Javě private, ale v PHP public, kvůli zpětné kompatibilitě s PHP 4. Je vždy jistější explicitně uvést kdy má být metoda přístupná.

K deklaraci vlastností NESMÍTE použít klíčové slovo var.

Var je pozůstatek z PHP 4 a i když se bohužel objevuje v některých "moderních" učebnicích programování, měli bychom na něj zapomenout.

Jeden příkaz NESMÍ deklarovat více než jednu vlastnost.

Ačkoli teoreticky můžeme deklarovat několik vlastností tímto stylem:

public $a, $b, $c;

Znemožníme tím dokumentaci vlastností.

Názvy privátních a chráněných vlastností by NEMĚLY být předsazeny podtržítkem.

Za dob starých a dávných, kdy jazyky ještě neuměly modifikátory přístupu, se používala konvence _vlastnost. Tato vlastnost byla chápána jako privátní. Tyto tendence občas spatříme u některých autorů i u moderních jazyků, kde však nemají žádný smysl.

Deklarace vlastností by tedy měla vypadat následujícím způsobem:

<?php
namespace Vendor\Package;

class ClassName
{
    public $foo = null;
}

Příště budeme v lekci Standardy jazyka PHP - PSR-2 část druhá se budeme zabývat zápisem metod, kontrolních struktur a uzávěrů.


 

Předchozí článek
Standardy jazyka PHP - Úvod a PSR-1
Všechny články v sekci
Standardy jazyka PHP
Přeskočit článek
(nedoporučujeme)
Standardy jazyka PHP - PSR-2 část druhá
Článek pro vás napsal David Hartinger
Avatar
Uživatelské hodnocení:
14 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