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

  • concatSpacing mezery kolem tečky
  • unaryOperatorSpacing žádná mezera mezi unárním operátorem a operandem
  • ternaryOperatorSpacing mezery kolem ? a :

Zdroj

Třída BinaryOperatorSpacingRule, fixtury binaryOperatorSpacing.