binaryOperatorSpacing
Kolem binárního operátoru, přiřazení, instanceof, => a =
výchozí hodnoty je z každé strany mezera; jestli smí zůstat i zarovnání do sloupců, říká volba.
Opravuje · v presetech perCs, psr12, nette, symfony ·
pokrývá binary_operator_spaces, PSR12.Operators.OperatorSpacing,
Squiz.ControlStructures.ForEachLoopDeclaration,
Squiz.WhiteSpace.LogicalOperatorSpacing, Squiz.WhiteSpace.OperatorSpacing
Co pravidlo hlídá
$a+1 se čte hůř než $a + 1 a $a=1 vypadá jako překlep. Pravidlo se stará
o mezery kolem aritmetických, porovnávacích, logických a bitových operátorů, kolem ??, kolem všech
přiřazení včetně += a ??=, kolem instanceof, kolem => v poli,
match i arrow funkci a kolem = u výchozí hodnoty parametru, vlastnosti nebo konstanty. Tečka pro
spojování řetězců má vlastní pravidlo concatSpacing, protože o ní se styly rozcházejí; = v
declare(strict_types=1) patří pravidlu declareSpacing.
Ve výchozím nastavení stačí aspoň jedna mezera: kdo si zarovnává přiřazení nebo hodnoty v poli pod sebe,
o zarovnání nepřijde. Volba alignment říká, které zarovnání smí zůstat: žádné, mezerami, tabulátory,
nebo jakékoli. U přiřazení a šipky pravidlo hlídá i řádek. Přiřazení včetně .= a +=,
= výchozí hodnoty nebo konstanty a => položky pole, větve match, yield
a foreach zůstávají na řádku levé strany a zalomení před nimi se spojí. Výjimkou je levá strana, která
sama zabírá víc řádků, a řádek, který by spojením přesáhl lineLength; bez limitu se
spojuje vždy. Co za nimi následuje, smí začít na dalším řádku. instanceof stojí na řádku obou operandů.
Šipka arrow funkce a property hooku smí stát na novém řádku, jak to dovoluje PER Coding Style. Za porovnávacím a bitovým
operátorem a za posunem << a >> se výraz z dalšího řádku přitáhne na řádek
operátoru, pokud mezi nimi nestojí komentář a spojený řádek nepřesáhne lineLength. U ostatních operátorů
se řádek nehlídá; o rozlomení výrazu přes řádky se starají pravidla multilineCall,
multilineChain, multilineCondition a další.
Příklad
$total=$price*$count; // At least one space before the `=` operator // At least one space after the `=` operator // At least one space before the `*` operator // At least one space after the `*` operator
$label = $count>1 ? 'items' : 'item'; // At least one space before the `>` operator // At least one space after the `>` operator
$map = ['a'=>1, 'b' => 2]; // At least one space before the double arrow // At least one space after the double arrow
$aligned = 1;
$alsoFine = 2;
$total = $price * $count;
$label = $count > 1 ? 'items' : 'item';
$map = ['a' => 1, 'b' => 2];
$aligned = 1;
$alsoFine = 2;
Poslední dva řádky zůstaly, jak byly: víc mezer než jedna výchozí nastavení dovoluje.
Volby
alignment
none, spaces, tabs nebo keep, výchozí spaces. Které
zarovnání kolem operátoru smí zůstat: none stáhne každou mezeru na jednu, spaces nechá sloupce
zarovnané mezerami, tabs sloupce zarovnané tabulátorem a keep jakékoli. Zarovnání jiného druhu,
než volba jmenuje, se stáhne na jednu mezeru.
rules:
binaryOperatorSpacing:
alignment: none
$aligned = 1; // A single space before the `=` operator
$alsoFine = 2; // A single space before the `=` operator
$aligned = 1;
$alsoFine = 2;
Kdo sloupce zarovnává tabulátorem, nechá projít jen ten; mezery navíc jsou pak překlep:
rules:
binaryOperatorSpacing:
alignment: tabs
$short = 1;
$longerName = 2;
$spaced = 3; // A single space before the `=` operator
$short = 1;
$longerName = 2;
$spaced = 3;
operatorPosition
keep nebo start, výchozí keep. Kde stojí binární operátor u zalomení řádku:
keep ho nechá, kde je, start přesune operátor, který končí řádek, na začátek dalšího. Na
místě zůstane operátor, za kterým stojí komentář. Porovnávací a bitové operátory a posuny se přesunou jen tam, kde by
spojený řádek přesáhl lineLength; jinak pravidlo řádky spojí a zalomení zmizí. Logický operátor, který
řetězí podmínku if, elseif, while nebo do-while, sem nepatří, jeho
místo určuje multilineCondition. Preset nette zapíná start.
rules:
binaryOperatorSpacing:
operatorPosition: start
$total = $price + // A line break before the `+` operator
$shipping - // A line break before the `-` operator
$discount;
$total = $price
+ $shipping
- $discount;
Související pravidla
concatSpacingmezery kolem tečkyunaryOperatorSpacingžádná mezera mezi unárním operátorem a operandemternaryOperatorSpacingmezery kolem?a:
Zdroj
Třída BinaryOperatorSpacingRule, fixtury binaryOperatorSpacing.