2. díl - Standardy jazyka PHP - PSR-2 část první

PHP Standardy Standardy jazyka PHP - PSR-2 část první

V minulém dílu našeho seriálu tutoriálů o standardech jazyka PHP jsme si uvedli standard PSR-1, který definoval jak vytvářet PHP soubory a jak pojmenovávat třídní prvky. V dnešním dí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ů.

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ř. devbook 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 pokračovat se zápisem metod, kontrolních struktur a uzávěrů.


 

  Aktivity (1)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Celkem (7 hlasů) :
4.857144.857144.857144.857144.85714


 


Miniatura
Všechny články v sekci
Standardy jazyka PHP

 

 

Komentáře

Avatar
Ondřej Štorc:

Chtěl bych se zeptat jak to je například s podmínkou, kde mají být složené závorky, na novém řádku nebo je to jedno?

Odpovědět 27.4.2014 16:32
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Michal Žůrek (misaz):

Podle mě se ti borci v tom rýpou až moc. Radši než 4 mezery používám tabulátor, Visual Studiu to nevadí, ale budiž to aspoň odůvodnili. Místo

class Foo
{

mám radí

class Foo {

Dále nesouhlasím s LF, proč bych tam nemohl mít i to CR?

Asi 90% věcí píšu tak jak doporučují, ten zbytek měnit nebudu.

Odpovědět 27.4.2014 16:33
Nesnáším {}, proto se jim vyhýbám.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Michal Žůrek (misaz)
David Čápka:

Třída a funkce se bere jako nějaký větší blok, který má zůstat opticky oddělený. Naopak u ifů se ta závorka píše na stejnou řádku, protože by zbytečně zabírala místo. Přiznám se, že zrovna tohle taky nedodržuji, ale hodně věcí z toho standardu dává dobrý smysl.

Odpovědět 27.4.2014 16:36
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Martin Konečný (pavelco1998):

Taky všude používám tabulátory pro odsazení (už dlouho jsem neviděl, že by to tak někde nebylo).
Také například píši TRUE, FALSE, NULL, nebo jedno slovo "use" pro více jmenných prostorů.

 
Odpovědět 27.4.2014 17:16
Avatar
Juraj Mlich
Redaktor
Avatar
Juraj Mlich:

Ja naopak zdá sa plním tieto štandardy na 100% a to som o nich nevedel. Všetko mi to tak pripadá prirodzenejšie.

Odpovědět  +4 27.4.2014 17:30
Vždy je lepšie učiť sa z cudzích chýb, než z vlastných chýb.
Avatar
asanos
Člen
Avatar
asanos:

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

  • Vím, že některé verze doplňují něco na konec řádku, ale stejně jsem to nikdy nepoužil a s problémy jsem se nesetkal.

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

  • může se použít i /r u Windows?

Řá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ů.

  • je tím myšleno tohle?
<?php
$a
  ->foo($x,$y,$z)
  ->aaa($a,$b,$c)
  ->xxx($v,$l,$k);
?>

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

  • Většina editorů dovoluje upravit, kolika mezerami má být reprezentován tabulátor. Ty co to neumí jich dělají 8. (A už jsem někde četl, že je pro odsazení povoleno 2,4, nebo i těch 8 )

Mimochodem už jsem se setkal se zarovnáváním operátorů pro přiřazení, jako název proměnné vlevo a potom hodnoty zarovnané ve sloupci vpravo. Je tam něco i o tomhle?

$a       ="banan";
$b       =1;
$c       =$b;
Editováno 29.4.2014 23:17
Odpovědět 29.4.2014 23:15
Na světě je 10 typů lidí. Ti, kteří rozumí binárce a ti co nerozumí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na asanos
David Čápka:

Kód by měl vypadat přesně tak, jak tu je popsáno. Tvé dotazy mi připadají zbytečné. Např. když je ve větě "Všechny soubory MUSÍ zakončovat řádky znakem Unix LF" a to MUSÍ je velkými písmeny, tak je jasné, že nemohou končit /r u Windows.

Odpovědět  +1 4.5.2014 12:00
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
debeneesse
Člen
Avatar
Odpovídá na Michal Žůrek (misaz)
debeneesse:

Osobně píšu závorku na stejný řádek jak u třídy, tak i u podmínek, ale možná, že u těch tříd to změním. Co se ale týče tabulátoru a co je opravdu hloupé, tak je představa, že mám nějakou funkci "odklepanou" mezerama, najednou přijde změna - chvíle, kdy potřebuju dát podmínku na začátek funkce a tím pádem nemůžu použít tabulátor pro odsazení více řádků najednou, protože editor, alespoň ten můj, by mezery automaticky zaměnil za tabulátory. Takže klepat, klepat... :@

 
Odpovědět 5.3.2015 22:54
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.