PSR-12 Standard Ready
PHP_CodeSniffer has included an in-progress PSR-12 standard since 3.3.0, but this release includes the completed standard. You can now check your code using the PSR-12 standard:
phpcs --standard=PSR12 /path/to/code
Most of the errors found can also be automatically fixed by PHPCBF:
phpcbf --standard=PSR12 /path/to/code
Changelog
- Added support for PHP 7.4 typed properties
- The nullable operator is now tokenized as
T_NULLABLE
inside property types, as it is elsewhere - To get the type of a member var, use the
File::getMemberProperties()
method, which now contains atype
array index- This contains the type of the member var, or a blank string if not specified
- If the type is nullable, the return type will contain the leading
?
- If a type is specified, the position of the first token in the type will be set in a
type_token
array index - If a type is specified, the position of the last token in the type will be set in a
type_end_token
array index - If the type is nullable, a
nullable_type
array index will also be set toTRUE
- If the type contains namespace information, it will be cleaned of whitespace and comments in the return value
- The nullable operator is now tokenized as
- The PSR1 standard now correctly bans alternate PHP tags
- Previously, it only banned short open tags and not the pre-7.0 alternate tags
- Added support for only checking files that have been locally staged in a git repo
- Use
--filter=gitstaged
to check these files - You still need to give PHPCS a list of files or directories in which to apply the filter
- Thanks to Juliette Reinders Folmer for the contribution
- Use
- JSON reports now end with a newline character
- The
phpcs.xsd
schema now validatesphpcs-only
andphpcbf-only
attributes correctly- Thanks to Juliette Reinders Folmer for the patch
- The tokenizer now correctly identifies inline control structures in more cases
- All helper methods inside the
File
class now throwRuntimeException
instead ofTokenizerException
- Some tokenizer methods were also throwing
RuntimeExpection
but now correctly throwTokenizerException
- Thanks to Juliette Reinders Folmer for the patch
- Some tokenizer methods were also throwing
- The
File::getMethodParameters()
method now returns more information, and supports closure USE groups- If a type hint is specified, the position of the last token in the hint will be set in a
type_hint_end_token
array index - If a default is specified, the position of the first token in the default value will be set in a
default_token
array index - If a default is specified, the position of the equals sign will be set in a
default_equal_token
array index - If the param is not the last, the position of the comma will be set in a
comma_token
array index - If the param is passed by reference, the position of the reference operator will be set in a
reference_token
array index - If the param is variable length, the position of the variadic operator will be set in a
variadic_token
array index
- If a type hint is specified, the position of the last token in the hint will be set in a
- The
T_LIST
token and it's opening and closing parentheses now contain references to each other in the tokens array- Uses the same parenthesis_opener/closer/owner indexes as other tokens
- Thanks to Juliette Reinders Folmer for the patch
- The
T_ANON_CLASS
token and it's opening and closing parentheses now contain references to each other in the tokens array- Uses the same parenthesis_opener/closer/owner indexes as other tokens
- Only applicable if the anon class is passing arguments to the constructor
- Thanks to Juliette Reinders Folmer for the patch
- The PHP 7.4
T_BAD_CHARACTER
token has been made available for older versions- Allows you to safely look for this token, but it will not appear unless checking with PHP 7.4+
- Metrics are now available for
Squiz.WhiteSpace.FunctionSpacing
- Use the
info
report to see blank lines before/after functions - Thanks to Juliette Reinders Folmer for the patch
- Use the
- Metrics are now available for
Squiz.WhiteSpace.MemberVarSpacing
- Use the
info
report to see blank lines before member vars - Thanks to Juliette Reinders Folmer for the patch
- Use the
- Added
Generic.ControlStructures.DisallowYodaConditions
sniff- Ban the use of Yoda conditions
- Thanks to Mponos George for the contribution
- Added
Generic.PHP.RequireStrictTypes
sniff- Enforce the use of a strict types declaration in PHP files
- Added
Generic.WhiteSpace.SpreadOperatorSpacingAfter
sniff- Checks whitespace between the spread operator and the variable/function call it applies to
- Thanks to Juliette Reinders Folmer for the contribution
- Added
PSR12.Classes.AnonClassDeclaration
sniff- Enforces the formatting of anonymous classes
- Added
PSR12.Classes.ClosingBrace
sniff- Enforces that closing braces of classes/interfaces/traits/functions are not followed by a comment or statement
- Added
PSR12.ControlStructures.BooleanOperatorPlacement
sniff- Enforces that boolean operators between conditions are consistently at the start or end of the line
- Added
PSR12.ControlStructures.ControlStructureSpacing
sniff- Enforces that spacing and indents are correct inside control structure parenthesis
- Added
PSR12.Files.DeclareStatement
sniff- Enforces the formatting of declare statements within a file
- Added
PSR12.Files.FileHeader
sniff- Enforces the order and formatting of file header blocks
- Added
PSR12.Files.ImportStatement
sniff- Enforces the formatting of import statements within a file
- Added
PSR12.Files.OpenTag
sniff- Enforces that the open tag is on a line by itself when used at the start of a php-only file
- Added
PSR12.Functions.ReturnTypeDeclaration
sniff- Enforces the formatting of return type declarations in functions and closures
- Added
PSR12.Properties.ConstantVisibility
sniff- Enforces that constants must have their visibility defined
- Uses a warning instead of an error due to this conditionally requiring the project to support PHP 7.1+
- Added
PSR12.Traits.UseDeclaration
sniff- Enforces the formatting of trait import statements within a class
Generic.Files.LineLength
ignoreComments
property now ignores comments at the end of a line- Previously, this property was incorrectly causing the sniff to ignore any line that ended with a comment
- Now, the trailing comment is not included in the line length, but the rest of the line is still checked
Generic.Files.LineLength
now only ignores unwrappable comments when the comment is on a line by itself- Previously, a short unwrappable comment at the end of the line would have the sniff ignore the entire line
Generic.Functions.FunctionCallArgumentSpacing
no longer checks spacing around assignment operators inside function calls- Use the
Squiz.WhiteSpace.OperatorSpacing
sniff to enforce spacing around assignment operators- Note that this sniff checks spacing around all assignment operators, not just inside function calls
- The
Generic.Functions.FunctionCallArgumentSpacing.NoSpaceBeforeEquals
error has been removed- use
Squiz.WhiteSpace.OperatorSpacing.NoSpaceBefore
instead
- use
- The
Generic.Functions.FunctionCallArgumentSpacing.NoSpaceAfterEquals
error has been removed- use
Squiz.WhiteSpace.OperatorSpacing.NoSpaceAfter
instead
- use
- This also changes the PEAR/PSR2/PSR12 standards so they no longer check assignment operators inside function calls
- They were previously checking these operators when they should not have
- Thanks to Juliette Reinders Folmer for the patch
- Use the
Generic.WhiteSpace.ScopeIndent
no longer performs exact indents checking for chained method calls- Other sniffs can be used to enforce chained method call indent rules
- Thanks to Pieter Frenssen for the patch
PEAR.WhiteSpace.ObjectOperatorIndent
now supports multi-level chained statements- When enabled, chained calls must be indented 1 level more or less than the previous line
- Set the new
multilevel
setting toTRUE
in aruleset.xml
file to enable this behaviour - Thanks to Marcos Passos for the patch
PSR2.ControlStructures.ControlStructureSpacing
now allows whitespace after the opening parenthesis if followed by a comment- Thanks to Michał Bundyra for the patch
PSR2.Classes.PropertyDeclaration
now enforces a single space after a property type keyword- The PSR2 standard itself excludes this new check as it is not defined in the written standard
- Using the PSR12 standard will enforce this check
Squiz.Commenting.BlockComment
no longer requires blank line before comment if it's the first content after the PHP open tag- Thanks to Juliette Reinders Folmer for the patch
Squiz.Functions.FunctionDeclarationArgumentSpacing
now has more accurate error messages- This includes renaming the
SpaceAfterDefault
error code toSpaceAfterEquals
, which reflects the real error
- This includes renaming the
Squiz.Functions.FunctionDeclarationArgumentSpacing
now checks for no space after a reference operator- If you don't want this new behaviour, exclude the
SpacingAfterReference
error message in a ruleset.xml file
- If you don't want this new behaviour, exclude the
Squiz.Functions.FunctionDeclarationArgumentSpacing
now checks for no space after a variadic operator- If you don't want this new behaviour, exclude the
SpacingAfterVariadic
error message in aruleset.xml
file
- If you don't want this new behaviour, exclude the
Squiz.Functions.MultiLineFunctionDeclaration
now has improved fixing for theFirstParamSpacing
andUseFirstParamSpacing
errorsSquiz.Operators.IncrementDecrementUsage
now suggests pre-increment of variables instead of post-increment- This change does not enforce pre-increment over post-increment; only the suggestion has changed
- Thanks to Juliette Reinders Folmer for the patch
Squiz.PHP.DisallowMultipleAssignments
now has a second error code for when assignments are found inside control structure conditions- The new error code is
Squiz.PHP.DisallowMultipleAssignments.FoundInControlStructure
- All other multiple assignment cases use the existing error code
Squiz.PHP.DisallowMultipleAssignments.Found
- Thanks to Juliette Reinders Folmer for the patch
- The new error code is
Squiz.WhiteSpace.FunctionSpacing
now appliesbeforeFirst
andafterLast
spacing rules to nested functions- Previously, these rules only applied to the first and last function in a class, interface, or trait
- These rules now apply to functions nested in any statement block, including other functions and conditions
Squiz.WhiteSpace.OperatorSpacing
now has improved handling of parse errors- Thanks to Juliette Reinders Folmer for the patch
Squiz.WhiteSpace.OperatorSpacing
now checks spacing around theinstanceof
operator- Thanks to Jakub Chábek for the patch
Squiz.WhiteSpace.OperatorSpacing
can now enforce a single space before assignment operators- Previously, the sniff this spacing as multiple assignment operators are sometimes aligned
- Now, you can set the
ignoreSpacingBeforeAssignments
sniff property toFALSE
to enable checking - Default remains
TRUE
, so spacing before assignments is not checked by default - Thanks to Jakub Chábek for the patch
- Fixed bug #2391 : Sniff-specific ignore rules inside rulesets are filtering out too many files
- Thanks to Juliette Reinders Folmer and Willington Vega for the patch
- Fixed bug #2478 : FunctionCommentThrowTag.WrongNumber when exception is thrown once but built conditionally
- Fixed bug #2479 : Generic.WhiteSpace.ScopeIndent error when using array destructing with exact indent checking
- Fixed bug #2498 : Squiz.Arrays.ArrayDeclaration.MultiLineNotAllowed autofix breaks heredoc
- Fixed bug #2502 : Generic.WhiteSpace.ScopeIndent false positives with nested switch indentation and case fall-through
- Fixed bug #2504 : Generic.WhiteSpace.ScopeIndent false positives with nested arrays and nowdoc string
- Fixed bug #2511 : PSR2 standard not checking if closing paren of single-line function declaration is on new line
- Fixed bug #2512 : Squiz.PHP.NonExecutableCode does not support alternate SWITCH control structure
- Thanks to Juliette Reinders Folmer for the patch
- Fixed bug #2522 : Text generator throws error when code sample line is too long
- Thanks to Juliette Reinders Folmer for the patch
- Fixed bug #2526 : XML report format has bad syntax on Windows
- Thanks to Juliette Reinders Folmer for the patch
- Fixed bug #2529 : Generic.Formatting.MultipleStatementAlignment wrong error for assign in string concat
- Fixed bug #2534 : Unresolvable installed_paths can lead to open_basedir errors
- Thanks to Oliver Nowak for the patch
- Fixed bug #2541 : Text doc generator does not allow for multi-line rule explanations
- Thanks to Juliette Reinders Folmer for the patch
- Fixed bug #2549 : Searching for a phpcs.xml file can throw warnings due to open_basedir restrictions
- Thanks to Matthew Peveler for the patch
- Fixed bug #2558 : PHP 7.4 throwing offset syntax with curly braces is deprecated message
- Thanks to Matthew Peveler for the patch
- Fixed bug #2561 : PHP 7.4 compatibility fix / implode argument order
- Thanks to Juliette Reinders Folmer for the patch
- Fixed bug #2562 : Inline WHILE triggers SpaceBeforeSemicolon incorrectly
- Thanks to Juliette Reinders Folmer for the patch
- Fixed bug #2565 : Generic.ControlStructures.InlineControlStructure confused by mixed short/long tags
- Thanks to Juliette Reinders Folmer for the patch
- Fixed bug #2566 : Author tag email validation doesn't support all TLDs
- Thanks to Juliette Reinders Folmer for the patch
- Fixed bug #2575 : Custom error messages don't have data replaced when cache is enabled
- Fixed bug #2601 : Squiz.WhiteSpace.FunctionSpacing incorrect fix when spacing is 0
- Fixed bug #2608 : PSR2 throws errors for use statements when multiple namespaces are defined in a file