## Control structures #### SlevomatCodingStandard.ControlStructures.AssignmentInCondition Disallows assignments in `if`, `elseif` and `do-while` loop conditions: ```php if ($file = findFile($path)) { } ``` Assignment in `while` loop condition is specifically allowed because it's commonly used. This is a great addition to already existing `SlevomatCodingStandard.ControlStructures.DisallowYodaComparison` because it prevents the danger of assigning something by mistake instead of using a comparison operator like `===`. Sniff provides the following settings: * `ignoreAssignmentsInsideFunctionCalls`: ignores assignment inside function calls, like this: ```php if (in_array(1, $haystack, $strict = true)) { } ``` #### SlevomatCodingStandard.ControlStructures.BlockControlStructureSpacing 🔧 Enforces configurable number of lines around block control structures (if, foreach, ...). Sniff provides the following settings: * `linesCountBefore`: allows to configure the number of lines before control structure. * `linesCountBeforeFirst`: allows to configure the number of lines before first control structure. * `linesCountAfter`: allows to configure the number of lines after control structure. * `linesCountAfterLast`: allows to configure the number of lines after last control structure. * `controlStructures`: allows to narrow the list of checked control structures. For example, with the following setting, only `if` and `switch` keywords are checked. ```xml ``` #### SlevomatCodingStandard.ControlStructures.EarlyExit 🔧 Requires use of early exit. Sniff provides the following settings: * `ignoreStandaloneIfInScope`: ignores `if` that is standalone in scope, like this: ```php foreach ($values as $value) { if ($value) { doSomething(); } } ``` * `ignoreOneLineTrailingIf`: ignores `if` that has one line content and is on the last position in scope, like this: ```php foreach ($values as $value) { $value .= 'whatever'; if ($value) { doSomething(); } } ``` * `ignoreTrailingIfWithOneInstruction`: ignores `if` that has only one instruction and is on the last position in scope, like this: ```php foreach ($values as $value) { $value .= 'whatever'; if ($value) { doSomething(function () { // Anything }); } } ``` #### SlevomatCodingStandard.ControlStructures.DisallowContinueWithoutIntegerOperandInSwitch 🔧 Disallows use of `continue` without integer operand in `switch` because it emits a warning in PHP 7.3 and higher. #### SlevomatCodingStandard.ControlStructures.DisallowEmpty Disallows use of `empty()`. #### SlevomatCodingStandard.ControlStructures.DisallowNullSafeObjectOperator Disallows using `?->` operator. #### SlevomatCodingStandard.ControlStructures.DisallowShortTernaryOperator 🔧 Disallows short ternary operator `?:`. Sniff provides the following settings: * `fixable`: the sniff is fixable by default, however in strict code it makes sense to forbid this weakly typed form of ternary altogether, you can disable fixability with this option. #### SlevomatCodingStandard.ControlStructures.DisallowTrailingMultiLineTernaryOperator 🔧 Ternary operator has to be reformatted when the operator is not leading the line. ```php # wrong $t = $someCondition ? $thenThis : $otherwiseThis; # correct $t = $someCondition ? $thenThis : $otherwiseThis; ``` #### SlevomatCodingStandard.ControlStructures.JumpStatementsSpacing 🔧 Enforces configurable number of lines around jump statements (continue, return, ...). Sniff provides the following settings: * `allowSingleLineYieldStacking`: whether or not to allow multiple yield/yield from statements in a row without blank lines. * `linesCountBefore`: allows to configure the number of lines before jump statement. * `linesCountBeforeFirst`: allows to configure the number of lines before first jump statement. * `linesCountBeforeWhenFirstInCaseOrDefault`: allows to configure the number of lines before jump statement that is first in `case` or `default` * `linesCountAfter`: allows to configure the number of lines after jump statement. * `linesCountAfterLast`: allows to configure the number of lines after last jump statement. * `linesCountAfterWhenLastInCaseOrDefault`: allows to configure the number of lines after jump statement that is last in `case` or `default` * `linesCountAfterWhenLastInLastCaseOrDefault`: allows to configure the number of lines after jump statement that is last in last `case` or `default` * `jumpStatements`: allows to narrow the list of checked jump statements. For example, with the following setting, only `continue` and `break` keywords are checked. ```xml ``` #### SlevomatCodingStandard.ControlStructures.LanguageConstructWithParentheses 🔧 `LanguageConstructWithParenthesesSniff` checks and fixes language construct used with parentheses. #### SlevomatCodingStandard.ControlStructures.NewWithParentheses 🔧 Requires `new` with parentheses. #### SlevomatCodingStandard.ControlStructures.NewWithoutParentheses 🔧 Reports `new` with useless parentheses. #### SlevomatCodingStandard.ControlStructures.RequireMultiLineCondition 🔧 Enforces conditions of `if`, `elseif`, `while` and `do-while` with one or more boolean operators to be split to more lines so each condition part is on its own line. Sniff provides the following settings: * `minLineLength`: specifies minimum line length to enforce condition to be split. Use 0 value to enforce for all conditions, regardless of length. * `booleanOperatorOnPreviousLine`: boolean operator is placed at the end of previous line when fixing. * `alwaysSplitAllConditionParts`: require all condition parts to be on its own line - it reports error even if condition is already multi-line but there are some condition parts on the same line. #### SlevomatCodingStandard.ControlStructures.RequireMultiLineTernaryOperator 🔧 Ternary operator has to be reformatted to more lines when the line length exceeds the given limit. Sniff provides the following settings: * `lineLengthLimit` (defaults to `0`) * `minExpressionsLength` (defaults to `null`): when the expressions after `?` are shorter than this length, the ternary operator does not have to be reformatted. #### SlevomatCodingStandard.ControlStructures.RequireNullCoalesceEqualOperator 🔧 Requires use of null coalesce equal operator when possible. This sniff provides the following setting: * `enable`: either to enable or not this sniff. By default, it is enabled for PHP versions 7.4 or higher. #### SlevomatCodingStandard.ControlStructures.RequireNullCoalesceOperator 🔧 Requires use of null coalesce operator when possible. #### SlevomatCodingStandard.ControlStructures.RequireNullSafeObjectOperator 🔧 Requires using `?->` operator. Sniff provides the following settings: * `enable`: either to enable or not this sniff. By default, it is enabled for PHP versions 8.0 or higher. #### SlevomatCodingStandard.ControlStructures.RequireSingleLineCondition 🔧 Enforces conditions of `if`, `elseif`, `while` and `do-while` to be on a single line. Sniff provides the following settings: * `maxLineLength`: specifies max allowed line length. If condition (and the rest of the line) would fit on it, it's enforced. Use 0 value to enforce for all conditions, regardless of length. * `alwaysForSimpleConditions`: allows to enforce single line for all simple conditions (i.e no `&&`, `||` or `xor`), regardless of length. #### SlevomatCodingStandard.ControlStructures.RequireShortTernaryOperator 🔧 Requires short ternary operator `?:` when possible. #### SlevomatCodingStandard.ControlStructures.RequireTernaryOperator 🔧 Requires ternary operator when possible. Sniff provides the following settings: * `ignoreMultiLine` (defaults to `false`): ignores multi-line statements. #### SlevomatCodingStandard.ControlStructures.DisallowYodaComparison 🔧 #### SlevomatCodingStandard.ControlStructures.RequireYodaComparison 🔧 [Yoda conditions](https://en.wikipedia.org/wiki/Yoda_conditions) decrease code comprehensibility and readability by switching operands around comparison operators forcing the reader to read the code in an unnatural way. Sniff provides the following settings: * `alwaysVariableOnRight` (defaults to `false`): moves variables always to right. `DisallowYodaComparison` looks for and fixes such comparisons not only in `if` statements but in the whole code. However, if you prefer Yoda conditions, you can use `RequireYodaComparison`. #### SlevomatCodingStandard.ControlStructures.UselessIfConditionWithReturn 🔧 Reports useless conditions where both branches return `true` or `false`. Sniff provides the following settings: * `assumeAllConditionExpressionsAreAlreadyBoolean` (defaults to `false`). #### SlevomatCodingStandard.ControlStructures.UselessTernaryOperator 🔧 Reports useless ternary operator where both branches return `true` or `false`. Sniff provides the following settings: * `assumeAllConditionExpressionsAreAlreadyBoolean` (defaults to `false`).