Skip to content

Releases: PHPCSStandards/PHP_CodeSniffer

3.8.1 - 2024-01-11

11 Jan 21:17
3.8.1
14f5fff
Compare
Choose a tag to compare

Added

  • Documentation has been added for the following sniffs:
    • Generic.CodeAnalysis.EmptyPHPStatement
    • Generic.Formatting.SpaceBeforeCast
    • Generic.PHP.Syntax
    • Generic.WhiteSpace.LanguageConstructSpacing
    • PSR12.Classes.ClosingBrace
    • PSR12.Classes.OpeningBraceSpace
    • PSR12.ControlStructures.BooleanOperatorPlacement
    • PSR12.Files.OpenTag
    • Thanks to Rodrigo Primo and Denis Žoljom for the patches

Changed

Fixed

  • Fixed bug #124 : Report Full : avoid unnecessarily wrapping lines when -s is used
  • Fixed bug #124 : Report Full : fix incorrect bolding of pipes when -s is used and messages wraps
  • Fixed bug #150 : Squiz.WhiteSpace.KeywordSpacing : prevent a PHP notice when run during live coding
  • Fixed bug #154 : Report Full : delimiter line calculation could go wonky on wide screens when a report contains multi-line messages
  • Fixed bug #178 : Squiz.Commenting.VariableComment : docblocks were incorrectly being flagged as missing when a property declaration used PHP native union/intersection type declarations
  • Fixed bug #211 : Squiz.Commenting.VariableComment : docblocks were incorrectly being flagged as missing when a property declaration used PHP 8.2+ stand-alone true/false/null type declarations
  • Fixed bug #211 : Squiz.Commenting.VariableComment : docblocks were incorrectly being flagged as missing when a property declaration used PHP native parent, self or a namespace relative class name type declaration
  • Fixed bug #226 : Generic.CodeAnalysis.ForLoopShouldBeWhileLoop : prevent a potential PHP 8.3 deprecation notice during live coding

New Contributors

The PHP_CodeSniffer project is happy to welcome the following new contributors:
@anomiex, @dingo-d, @fcool, @lucc, @rodrigoprimo

Statistics

Closed: 4 issues
Merged: 63 pull requests

If you like what you see, please consider funding the PHP_CodeSniffer project. If you already do so: thank you!

3.8.0 - 2023-12-08

08 Dec 13:16
3.8.0
5805f7a
Compare
Choose a tag to compare

Squizlabs/PHP_CodeSniffer is dead. Long live PHPCSStandards/PHP_CodeSniffer!

Breaking Changes

  • The squizlabs/PHP_CodeSniffer repository has been abandoned. The PHPCSStandards/PHP_CodeSniffer repository will serve as the continuation of the project. For more information about this change, please read the announcement.
    • Installation of PHP_CodeSniffer via PEAR is no longer supported.
      • Users will need to switch to another installation method.
      • Note: this does not affect the PEAR sniffs.
    • For Composer users, nothing changes.
      • In contrast to earlier information, the squizlabs/php_codesniffer package now points to the new repository and everything will continue to work as before.
    • PHIVE users may need to clear the PHIVE URL cache.
      • PHIVE users who don't use the package alias, but refer to the package URL, will need to update the URL from https://squizlabs.github.io/PHP_CodeSniffer/phars/ to https://phars.phpcodesniffer.com/phars/.
    • Users who download the PHAR files using curl or wget, will need to update the download URL from https://squizlabs.github.io/PHP_CodeSniffer/[phpcs|phpcbf].phar or https://github.com/squizlabs/PHP_CodeSniffer/releases/latest/download/[phpcs|phpcbf].phar to https://phars.phpcodesniffer.com/[phpcs|phpcbf].phar.
    • For users who install PHP_CodeSniffer via the setup-php action runner for GitHub Actions, nothing changes.
    • Users using a git clone will need to update the clone address from [email protected]:squizlabs/PHP_CodeSniffer.git to [email protected]:PHPCSStandards/PHP_CodeSniffer.git.
      • Contributors will need to fork the new repo and add both the new fork as well as the new repo as remotes to their local git copy of PHP_CodeSniffer.
      • Users who have (valid) open issues or pull requests in the squizlabs/PHP_CodeSniffer repository are invited to resubmit these to the PHPCSStandards/PHP_CodeSniffer repository.

Added

  • Runtime support for PHP 8.3. All known PHP 8.3 deprecation notices have been fixed
    • Syntax support for new PHP 8.3 features will follow in a future release
    • If you find any PHP 8.3 deprecation notices which were missed, please report them
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patches
  • Added support for PHP 8.2 readonly classes to File::getClassProperties() through a new is_readonly array index in the return value
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Added support for PHP 8.2 readonly classes to a number of sniffs
    • Generic.CodeAnalysis.UnnecessaryFinalModifier
    • PEAR.Commenting.ClassComment
    • PEAR.Commenting.FileComment
    • PSR1.Files.SideEffects
    • PSR2.Classes.ClassDeclaration
    • PSR12.Files.FileHeader
    • Squiz.Classes.ClassDeclaration
    • Squiz.Classes.LowercaseClassKeywords
    • Squiz.Commenting.ClassComment
    • Squiz.Commenting.DocCommentAlignment
    • Squiz.Commenting.FileComment
    • Squiz.Commenting.InlineComment
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Added support for PHP 8.2 true as a stand-alone type declaration
    • The File::getMethodProperties(), File::getMethodParameters() and File::getMemberProperties() methods now all support the true type
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Added support for PHP 8.2 true as a stand-alone type to a number of sniffs
    • Generic.PHP.LowerCaseType
    • PSr12.Functions.NullableTypeDeclaration
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Added a Performance report to allow for finding "slow" sniffs
    • To run this report, run PHPCS with --report=Performance.
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Generic.PHP.RequireStrictTypes : new warning for when there is a declare statement, but the strict_types directive is set to 0
    • The warning can be turned off by excluding the Generic.PHP.RequireStrictTypes.Disabled error code
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Squiz.Commenting.FunctionComment : new ParamNameUnexpectedAmpersandPrefix error for parameters annotated as passed by reference while the parameter is not passed by reference
    • Thanks to Dan Wallis (@fredden) for the patch
  • Documentation has been added for the following sniffs:
    • PSR2.Files.ClosingTag
    • PSR2.Methods.FunctionCallSignature
    • PSR2.Methods.FunctionClosingBrace
    • Thanks to Atsushi Okui (@blue32a) for the patch
  • Support for PHPUnit 8 and 9 to the test suite
    • Test suites for external standards which run via the PHPCS native test suite can now run on PHPUnit 4-9 (was 4-7)
    • If any of these tests use the PHPUnit setUp()/tearDown() methods or overload the setUp() in the AbstractSniffUnitTest test case, they will need to be adjusted. See the PR details for further information
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch

Changed

  • Changes have been made to the way PHPCS handles invalid sniff properties being set in a custom ruleset
    • Fixes PHP 8.2 deprecation notices for properties set in a (custom) ruleset for complete standards/complete sniff categories
    • Invalid sniff properties set for individual sniffs will now result in an error and halt the execution of PHPCS
      • A descriptive error message is provided to allow users to fix their ruleset
    • Sniff properties set for complete standards/complete sniff categories will now only be set on sniffs which explicitly support the property
      • The property will be silently ignored for those sniffs which do not support the property
    • Invalid sniff properties set for sniffs via inline annotations will result in an informative Internal.PropertyDoesNotExist errror on line 1 of the scanned file, but will not halt the execution of PHPCS
    • For sniff developers, it is strongly recommended for sniffs to explicitly declare any user-adjustable public properties
      • If dynamic properties need to be supported for a sniff, either declare the magic __set()/__get()/__isset()/__unset() methods on the sniff or let the sniff extend stdClass
      • Note: The #[\AllowDynamicProperties] attribute will have no effect for properties which are being set in rulesets
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • The third parameter for the Ruleset::setSniffProperty() method has been changed to expect an array
    • Sniff developers/integrators of PHPCS may need to make some small adjustments to allow for this change
    • Existing code will continue to work but will throw a deprecation error
    • The backwards compatiblity layer will be removed in PHPCS 4.0
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • When using auto report width (the default) a value of 80 columns will be used if the width cannot be determined
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Sniff error messages are now more informative to help bugs get reported to the correct project
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Generic.CodeAnalysis.UnusedFunctionParameter will now ignore magic methods for which the signature is defined by PHP
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Generic.Functions.OpeningFunctionBraceBsdAllman will now check the brace indent before the opening brace for empty functions
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Generic.Functions.OpeningFunctionBraceKernighanRitchie will now check the spacing before the opening brace for empty functions
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Generic.WhiteSpace.IncrementDecrementSpacing now detects more spacing issues
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • PSR2.Classes.PropertyDeclaration now enforces that the readonly modifier comes after the visibility modifier
    • PSR2 and PSR12 do not have documented rules for this as they pre-date the readonly modifier
    • PSR-PER has been used to confirm the order of this keyword so it can be applied to PSR2 and PSR12 correctly
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • PEAR.Commenting.FunctionComment + Squiz.Commenting.FunctionComment: the SpacingAfter error can now be auto-fixed
    • Thanks to Dan Wallis (@fredden) for the patch
  • Squiz.PHP.InnerFunctions sniff no longer reports on OO methods for OO structures declared within a function or closure
  • Squiz.PHP.NonExecutableCode will now also flag redundant return statements just before a closure close brace
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Runtime performance improvement for PHPCS CLI users. The improvement should be most noticeable for users on Windows.
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • The following sniffs have received performance related improvements:
    • Generic.PHP.LowerCaseConstant
    • Generic.PHP.LowerCaseType
    • PSR12.Files.OpenTag
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patches
  • The -e (explain) command will now list sniffs in natural order
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Tests using the PHPCS native test framework with multiple test case files will now run the test case files in numeric order.
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • The following sniffs have received minor message readability improvements:
    • Generic.Arrays.ArrayIndent
      ...
Read more

3.7.2 - 2023-02-23

08 Nov 07:46
3.7.2
ed8e00d
Compare
Choose a tag to compare
  • Newer versions of Composer will now suggest installing PHPCS using require-dev instead of require
  • A custom Out Of Memory error will now be shown if PHPCS or PHPCBF run out of memory during a run
    • Error message provides actionable information about how to fix the problem and ensures the error is not silent
    • Thanks to Juliette Reinders Folmer (@jrfnl) and Alain Schlesser (@schlessera) for the patch
  • Generic.PHP.LowerCaseType sniff now correctly examines types inside arrow functions
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Squiz.Formatting.OperatorBracket no longer reports false positives in match() structures
  • Fixed bug #3616 : Squiz.PHP.DisallowComparisonAssignment false positive for PHP 8 match expression
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3618 : Generic.WhiteSpace.ArbitraryParenthesesSpacing false positive for return new parent()
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3632 : Short list not tokenized correctly in control structures without braces
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3639 : Tokenizer not applying tab replacement to heredoc/nowdoc closers
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3640 : Generic.WhiteSpace.DisallowTabIndent not reporting errors for PHP 7.3 flexible heredoc/nowdoc syntax
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3645 : PHPCS can show 0 exit code when running in parallel even if child process has fatal error
    • Thanks to Alex Panshin (@enl) for the patch
  • Fixed bug #3653 : False positives for match() in OperatorSpacingSniff
    • Thanks to Jaroslav Hanslík (@kukulich) for the patch
  • Fixed bug #3666 : PEAR.Functions.FunctionCallSignature incorrect indent fix when checking mixed HTML/PHP files
  • Fixed bug #3668 : PSR12.Classes.ClassInstantiation.MissingParentheses false positive when instantiating parent classes
    • Similar issues also fixed in Generic.Functions.FunctionCallArgumentSpacing and Squiz.Formatting.OperatorBracket
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3672 : Incorrect ScopeIndent.IncorrectExact report for match inside array literal
  • Fixed bug #3694 : Generic.WhiteSpace.SpreadOperatorSpacingAfter does not ignore spread operator in PHP 8.1 first class callables
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch

3.7.1 - 2022-06-18

08 Nov 07:45
3.7.1
1359e17
Compare
Choose a tag to compare
  • Fixed bug #3609: Methods/constants with name empty/isset/unset are always reported as error
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch

3.7.0 - 2022-06-13

08 Nov 07:45
3.7.0
a2cd51b
Compare
Choose a tag to compare

PHP 8.1 Language Feature Support

PHP_CodeSniffer has run correctly under PHP 8.1 since PHP 8 support was added, but it has not supported new 8.1 language features until this release. Version 3.7.0 adds support for the following PHP 8.1 language features:

  • Enums
  • Explicit octal notation
  • Readonly properties
  • Intersection types
  • The never type

Note: Standards and sniffs included with PHP_CodeSniffer have been updated to support these language features, but external standards and sniffs may need updating before they are able to detect them correctly.

Changelog

  • Added support for PHP 8.1 explicit octal notation
    • This new syntax has been backfilled for PHP versions less than 8.1
    • Thanks to Mark Baker (@MarkBaker) for the patch
    • Thanks to Juliette Reinders Folmer (@jrfnl) for additional fixes
  • Added support for PHP 8.1 enums
    • This new syntax has been backfilled for PHP versions less than 8.1
    • Includes a new T_ENUM_CASE token to represent the case statements inside an enum
    • Thanks to Jaroslav Hanslík (@kukulich) for the patch
    • Thanks to Juliette Reinders Folmer (@jrfnl) for additional core and sniff support
  • Added support for the PHP 8.1 readonly token
    • Tokenzing of the readonly keyword has been backfilled for PHP versions less than 8.1
    • Thanks to Jaroslav Hanslík (@kukulich) for the patch
  • Added support for PHP 8.1 intersection types
    • Includes a new T_TYPE_INTERSECTION token to represent the ampersand character inside intersection types
    • Thanks to Jaroslav Hanslík (@kukulich) for the patch
  • File::getMethodParameters now supports the new PHP 8.1 readonly token
    • When constructor property promotion is used, a new property_readonly array index is included in the return value
      • This is a boolean value indicating if the property is readonly
    • If the readonly token is detected, a new readonly_token array index is included in the return value
      • This contains the token index of the readonly keyword
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Support for new PHP 8.1 readonly keyword has been added to the following sniffs:
    • Generic.PHP.LowerCaseKeyword
    • PSR2.Classes.PropertyDeclaration
    • Squiz.Commenting.BlockComment
    • Squiz.Commenting.DocCommentAlignment
    • Squiz.Commenting.VariableComment
    • Squiz.WhiteSpace.ScopeKeywordSpacing
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patches
  • The parallel feature is now more efficient and runs faster in some situations due to improved process management
    • Thanks to Sergei Morozov (@morozov) for the patch
  • The list of installed coding standards now has consistent ordering across all platforms
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Generic.PHP.UpperCaseConstant and Generic.PHP.LowerCaseConstant now ignore type declarations
    • These sniffs now only report errors for true/false/null when used as values
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Generic.PHP.LowerCaseType now supports the PHP 8.1 never type
    • Thanks to Jaroslav Hanslík (@kukulich) for the patch
  • Fixed bug #3502 : A match statement within an array produces Squiz.Arrays.ArrayDeclaration.NoKeySpecified
  • Fixed bug #3503 : Squiz.Commenting.FunctionComment.ThrowsNoFullStop false positive when one line @throw
  • Fixed bug #3505 : The nullsafe operator is not counted in Generic.Metrics.CyclomaticComplexity
  • Fixed bug #3526 : PSR12.Properties.ConstantVisibility false positive when using public final const syntax
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3530 : Line indented incorrectly false positive when using match-expression inside switch case
  • Fixed bug #3534 : Name of typed enum tokenized as T_GOTO_LABEL
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3546 : Tokenizer/PHP: bug fix - parent/static keywords in class instantiations
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3550 : False positive from PSR2.ControlStructures.SwitchDeclaration.TerminatingComment when using trailing comment
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3575: Squiz.Scope.MethodScope misses visibility keyword on previous line
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3604: Tokenizer/PHP: bug fix for double quoted strings using ${
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch

3.6.2 - 2021-12-12

08 Nov 07:43
3.6.2
5e4e715
Compare
Choose a tag to compare
  • Processing large code bases that use tab indenting inside comments and strings will now be faster
  • Fixed bug #3388 : phpcs does not work when run from WSL drives
    • Thanks to Juliette Reinders Folmer (@jrfnl) and Graham Wharton (@gwharton) for the patch
  • Fixed bug #3422 : Squiz.WhiteSpace.ScopeClosingBrace fixer removes HTML content when fixing closing brace alignment
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3437 : PSR12 does not forbid blank lines at the start of the class body
    • Added new PSR12.Classes.OpeningBraceSpace sniff to enforce this
  • Fixed bug #3440 : Squiz.WhiteSpace.MemberVarSpacing false positives when attributes used without docblock
    • Thanks to Vadim Borodavko (@javer) for the patch
  • Fixed bug #3448 : PHP 8.1 deprecation notice while generating running time value
    • Thanks to Juliette Reinders Folmer (@jrfnl) and Andy Postnikov (@andypost) for the patch
  • Fixed bug #3456 : PSR12.Classes.ClassInstantiation.MissingParentheses false positive using attributes on anonymous class
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3460 : Generic.Formatting.MultipleStatementAlignment false positive on closure with parameters
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3468 : do/while loops are double-counted in Generic.Metrics.CyclomaticComplexity
  • Fixed bug #3469 : Ternary Operator and Null Coalescing Operator are not counted in Generic.Metrics.CyclomaticComplexity
  • Fixed bug #3472 : PHP 8 match() expression is not counted in Generic.Metrics.CyclomaticComplexity

3.6.1 - 2021-10-11

08 Nov 07:41
3.6.1
f268ca4
Compare
Choose a tag to compare
  • PHPCS annotations can now be specified using hash-style comments
    • Previously, only slash-style and block-style comments could be used to do things like disable errors
    • Thanks to Juliette Reinders Folmer for the patch
  • Fixed an issue where some sniffs would not run on PHP files that only used the short echo tag
    • The following sniffs were affected:
      • Generic.Files.ExecutableFile
      • Generic.Files.LowercasedFilename
      • Generic.Files.LineEndings
      • Generic.Files.EndFileNewline
      • Generic.Files.EndFileNoNewline
      • Generic.PHP.ClosingPHPTag
      • Generic.PHP.Syntax
      • Generic.VersionControl.GitMergeConflict
      • Generic.WhiteSpace.DisallowSpaceIndent
      • Generic.WhiteSpace.DisallowTabIndent
    • Thanks to Juliette Reinders Folmer for the patch
  • The new PHP 8.1 tokenisation for ampersands has been reverted to use the existing PHP_CodeSniffer method
    • The PHP 8.1 tokens T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG and T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG are unsued
    • Ampersands continue to be tokenized as T_BITWISE_AND for all PHP versions
    • Thanks to Juliette Reinders Folmer and Anna Filina for the patch
  • File::getMethodParameters() no longer incorrectly returns argument attributes in the type hint array index
    • A new has_attributes array index is available and set to TRUE if the argument has attributes defined
    • Thanks to Juliette Reinders Folmer for the patch
  • Generic.NamingConventions.ConstructorName no longer throws deprecation notices on PHP 8.1
    • Thanks to Juliette Reinders Folmer for the patch
  • Squiz.Commenting.BlockComment now correctly applies rules for block comments after a short echo tag
    • Thanks to Juliette Reinders Folmer for the patch
  • Fixed false positives when using attributes in the following sniffs:
    • PEAR.Commenting.FunctionComment
    • Squiz.Commenting.InlineComment
    • Squiz.Commenting.BlockComment
    • Squiz.Commenting.VariableComment
    • Squiz.WhiteSpace.MemberVarSpacing
    • Thanks to Juliette Reinders Folmer for the patch
  • Fixed bug #3294 : Bug in attribute tokenization when content contains PHP end token or attribute closer on new line
    • Thanks to Alessandro Chitolina for the patch
    • Thanks to Juliette Reinders Folmer for the tests
  • Fixed bug #3296 : PSR2.ControlStructures.SwitchDeclaration takes phpcs:ignore as content of case body
  • Fixed bug #3297 : PSR2.ControlStructures.SwitchDeclaration.TerminatingComment does not handle try/finally blocks
    • Thanks to Juliette Reinders Folmer for the patch
  • Fixed bug #3302 : PHP 8.0 | Tokenizer/PHP: bugfix for union types using namespace operator
    • Thanks to Juliette Reinders Folmer for the patch
  • Fixed bug #3303 : findStartOfStatement() doesn't work with T_OPEN_TAG_WITH_ECHO
  • Fixed bug #3316 : Arrow function not tokenized correctly when using null in union type
  • Fixed bug #3317 : Problem with how phpcs handles ignored files when running in parallel
    • Thanks to Emil Andersson for the patch
  • Fixed bug #3324 : PHPCS hangs processing some nested arrow functions inside a function call
  • Fixed bug #3326 : Generic.Formatting.MultipleStatementAlignment error with const DEFAULT
    • Thanks to Juliette Reinders Folmer for the patch
  • Fixed bug #3333 : Squiz.Objects.ObjectInstantiation: null coalesce operators are not recognized as assignment
    • Thanks to Juliette Reinders Folmer for the patch
  • Fixed bug #3340 : Ensure interface and trait names are always tokenized as T_STRING
    • Thanks to Juliette Reinders Folmer for the patch
  • Fixed bug #3342 : PSR12/Squiz/PEAR standards all error on promoted properties with docblocks
    • Thanks to Juliette Reinders Folmer for the patch
  • Fixed bug #3345 : IF statement with no braces and double catch turned into syntax error by auto-fixer
    • Thanks to Juliette Reinders Folmer for the patch
  • Fixed bug #3352 : PSR2.ControlStructures.SwitchDeclaration can remove comments on the same line as the case statement while fixing
    • Thanks to Juliette Reinders Folmer for the patch
  • Fixed bug #3357 : Generic.Functions.OpeningFunctionBraceBsdAllman removes return type when additional lines are present
    • Thanks to Juliette Reinders Folmer for the patch
  • Fixed bug #3362 : Generic.WhiteSpace.ScopeIndent false positive for arrow functions inside arrays
  • Fixed bug #3384 : Squiz.Commenting.FileComment.SpacingAfterComment false positive on empty file
  • Fixed bug #3394 : Fix PHP 8.1 auto_detect_line_endings deprecation notice
  • Fixed bug #3400 : PHP 8.1: prevent deprecation notices about missing return types
    • Thanks to Juliette Reinders Folmer for the patch
  • Fixed bug #3424 : PHPCS fails when using PHP 8 Constructor property promotion with attributes
    • Thanks to Juliette Reinders Folmer for the patch
  • Fixed bug #3425 : PHP 8.1 | Runner::processChildProcs(): fix passing null to non-nullable bug
    • Thanks to Juliette Reinders Folmer for the patch
  • Fixed bug #3445 : Nullable parameter after attribute incorrectly tokenized as ternary operator
    • Thanks to Juliette Reinders Folmer for the patch

3.6.0 - 2021-04-09

08 Nov 07:40
3.6.0
ffced0d
Compare
Choose a tag to compare

PHP 8 Language Feature Support

PHP_CodeSniffer has run under PHP 8 for some time, but it has not supported all new language features until this release. Version 3.6.0 adds support for all new PHP 8 language features, including:

  • Attributes
  • Constructor property promotion
  • Named arguments
  • Union types
  • Match expressions
  • Static and Mixed return types

Note: All standards and sniffs included with PHP_CodeSniffer have been updated to support these language features, but external standards and sniffs may need updating before they are able to detect them correctly.

Changelog

  • Added support for PHP 8.0 union types
    • A new T_TYPE_UNION token is available to represent the pipe character
    • File::getMethodParameters(), getMethodProperties(), and getMemberProperties() will now return union types
    • Thanks to Juliette Reinders Folmer for the patch
  • Added support for PHP 8.0 named function call arguments
    • A new T_PARAM_NAME token is available to represent the label with the name of the function argument in it
    • Thanks to Juliette Reinders Folmer for the patch
  • Added support for PHP 8.0 attributes
    • The PHP-supplied T_ATTRIBUTE token marks the start of an attribute
    • A new T_ATTRIBUTE_END token is available to mark the end of an attribute
    • New attribute_owner and attribute_closer indexes are available in the tokens array for all tokens inside an attribute
    • Tokenizing of attributes has been backfilled for older PHP versions
    • The following sniffs have been updated to support attributes:
      • PEAR.Commenting.ClassComment
      • PEAR.Commenting.FileComment
      • PSR1.Files.SideEffects
      • PSR12.Files.FileHeader
      • Squiz.Commenting.ClassComment
      • Squiz.Commenting.FileComment
      • Squiz.WhiteSpace.FunctionSpacing
        • Thanks to Vadim Borodavko for the patch
    • Thanks to Alessandro Chitolina for the patch
  • Added support for PHP 8.0 dereferencing of text strings with interpolated variables
    • Thanks to Juliette Reinders Folmer for the patch
  • Added support for PHP 8.0 match expressions
    • Match expressions are now tokenised with parenthesis and scope openers and closers
      • Sniffs can listen for the T_MATCH token to process match expressions
      • Note that the case and default statements inside match expressions do not have scopes set
    • A new T_MATCH_ARROW token is available to represent the arrows in match expressions
    • A new T_MATCH_DEFAULT token is available to represent the default keyword in match expressions
    • All tokenizing of match expressions has been backfilled for older PHP versions
    • The following sniffs have been updated to support match expressions:
      • Generic.CodeAnalysis.AssignmentInCondition
      • Generic.CodeAnalysis.EmptyPHPStatement
        • Thanks to Vadim Borodavko for the patch
      • Generic.CodeAnalysis.EmptyStatement
      • Generic.PHP.LowerCaseKeyword
      • PEAR.ControlStructures.ControlSignature
      • PSR12.ControlStructures.BooleanOperatorPlacement
      • Squiz.Commenting.LongConditionClosingComment
      • Squiz.Commenting.PostStatementComment
      • Squiz.ControlStructures.LowercaseDeclaration
      • Squiz.ControlStructures.ControlSignature
      • Squiz.Formatting.OperatorBracket
      • Squiz.PHP.DisallowMultipleAssignments
      • Squiz.Objects.ObjectInstantiation
      • Squiz.WhiteSpace.ControlStructureSpacing
    • Thanks to Juliette Reinders Folmer for the patch
  • The value of the T_FN_ARROW token has changed from "T_FN_ARROW" to "PHPCS_T_FN_ARROW" to avoid package conflicts
    • This will have no impact on custom sniffs unless they are specifically looking at the value of the T_FN_ARROW constant
    • If sniffs are just using constant to find arrow functions, they will continue to work without modification
    • Thanks to Juliette Reinders Folmer for the patch
  • File::findStartOfStatement() now works correctly when passed the last token in a statement
  • File::getMethodParameters() now supports PHP 8.0 constructor property promotion
    • Returned method params now include a property_visibility and visibility_token index if property promotion is detected
    • Thanks to Juliette Reinders Folmer for the patch
  • File::getMethodProperties() now includes a return_type_end_token index in the return value
    • This indicates the last token in the return type, which is helpful when checking union types
    • Thanks to Juliette Reinders Folmer for the patch
  • Include patterns are now ignored when processing STDIN
    • Previously, checks using include patterns were excluded when processing STDIN when no file path was provided via --stdin-path
    • Now, all include and exclude rules are ignored when no file path is provided, allowing all checks to run
    • If you want include and exclude rules enforced when checking STDIN, use --stdin-path to set the file path
    • Thanks to Juliette Reinders Folmer for the patch
  • Spaces are now correctly escaped in the paths to external on Windows
    • Thanks to Juliette Reinders Folmer for the patch
  • Added Generic.NamingConventions.AbstractClassNamePrefix to enforce that class names are prefixed with "Abstract"
    • Thanks to Anna Borzenko for the contribution
  • Added Generic.NamingConventions.InterfaceNameSuffix to enforce that interface names are suffixed with "Interface"
    • Thanks to Anna Borzenko for the contribution
  • Added Generic.NamingConventions.TraitNameSuffix to enforce that trait names are suffixed with "Trait"
    • Thanks to Anna Borzenko for the contribution
  • Generic.CodeAnalysis.UnusedFunctionParameter can now be configured to ignore variable usage for specific type hints
    • This allows you to suppress warnings for some variables that are not required, but leave warnings for others
    • Set the ignoreTypeHints array property to a list of type hints to ignore
    • Thanks to Petr Bugyík for the patch
  • Generic.Formatting.MultipleStatementAlignment can now align statements at the start of the assignment token
    • Previously, the sniff enforced that the values were aligned, even if this meant the assignment tokens were not
    • Now, the sniff can enforce that the assignment tokens are aligned, even if this means the values are not
    • Set the alignAtEnd sniff property to false to align the assignment tokens
    • The default remains at true, so the assigned values are aligned
    • Thanks to John P. Bloch for the patch
  • Generic.PHP.LowerCaseType now supports checking of typed properties
    • Thanks to Juliette Reinders Folmer for the patch
  • Generic.PHP.LowerCaseType now supports checking of union types
    • Thanks to Juliette Reinders Folmer for the patch
  • PEAR.Commenting.FunctionComment and Squiz.Commenting.FunctionComment sniffs can now ignore private and protected methods
    • Set the minimumVisibility sniff property to protected to ignore private methods
    • Set the minimumVisibility sniff property to public to ignore both private and protected methods
    • The default remains at private, so all methods are checked
    • Thanks to Vincent Langlet for the patch
  • PEAR.Commenting.FunctionComment and Squiz.Commenting.FunctionComment sniffs can now ignore return tags in any method
    • Previously, only __construct and __destruct were ignored
    • Set the list of method names to ignore in the specialMethods sniff property
    • The default remains at __construct and __destruct only
    • Thanks to Vincent Langlet for the patch
  • PSR2.ControlStructures.SwitchDeclaration now supports nested switch statements where every branch terminates
    • Previously, if a CASE only contained a SWITCH and no direct terminating statement, a fall-through error was displayed
    • Now, the error is suppressed if every branch of the SWITCH has a terminating statement
    • Thanks to Vincent Langlet for the patch
  • The PSR2.Methods.FunctionCallSignature.SpaceBeforeCloseBracket error message is now reported on the closing parenthesis token
    • Previously, the error was being reported on the function keyword, leading to confusing line numbers in the error report
  • Squiz.Commenting.FunctionComment is now able to ignore function comments that are only inheritdoc statements
    • Set the skipIfInheritdoc sniff property to true to skip checking function comments if the content is only {@inhertidoc}
    • The default remains at false, so these comments will continue to report errors
    • Thanks to Jess Myrbo for the patch
  • Squiz.Commenting.FunctionComment now supports the PHP 8 mixed type
    • Thanks to Vadim Borodavko for the patch
  • Squiz.PHP.NonExecutableCode now has improved handling of syntax errors
    • Thanks to Thiemo Kreuz for the patch
  • Squiz.WhiteSpace.ScopeKeywordSpacing now checks spacing when using PHP 8.0 constructor property promotion
    • Thanks to Juliette Reinders Folmer for the patch
  • Fixed an issue that could occur when checking files on network drives, such as with WSL2 on Windows 10
    • This works around a long-standing PHP bug with is_readable()
    • Thanks to Michael S for the patch
  • Fixed a number of false positives in the Squiz.PHP.DisallowMultipleAssignments sniff
    • Sniff no longer errors for default value assignments in arrow functions
    • Sniff no longer errors for assignments on first line of closure
    • Sniff no longer errors for assignments after a goto label
    • Thanks to Jaroslav Hanslík for the patch
  • Fixed bug #2913 : Generic.WhiteSpace.ScopeIndent false positive when opening and closing tag on same line inside conditional
  • Fixed bug [#299...
Read more

3.5.8 - 2020-10-23

08 Nov 07:37
3.5.8
9d58372
Compare
Choose a tag to compare
  • Reverted a change to the way include/exclude patterns are processed for STDIN content
    • This change is not backwards compatible and will be re-introduced in version 3.6.0

3.5.7 - 2020-10-23

08 Nov 07:36
3.5.7
4dbf1d5
Compare
Choose a tag to compare
  • The PHP 8.0 T_NULLSAFE_OBJECT_OPERATOR token has been made available for older versions
    • Existing sniffs that check for T_OBJECT_OPERATOR have been modified to apply the same rules for the nullsafe object operator
    • Thanks to Juliette Reinders Folmer for the patch
  • The new method of PHP 8.0 tokenizing for namespaced names has been revert to the pre 8.0 method
    • This maintains backwards compatible for existing sniffs on PHP 8.0
    • This change will be removed in PHPCS 4.0 as the PHP 8.0 tokenizing method will be backported for pre 8.0 versions
    • Thanks to Juliette Reinders Folmer for the patch
  • Added support for changes to the way PHP 8.0 tokenizes hash comments
    • The existing PHP 5-7 behaviour has been replicated for version 8, so no sniff changes are required
    • Thanks to Juliette Reinders Folmer for the patch
  • The autoloader has been changed to fix sniff class name detection issues that may occur when running on PHP 7.4+
    • Thanks to Eloy Lafuente for the patch
  • Running the unit tests now includes warnings in the found and fixable error code counts
    • Thanks to Juliette Reinders Folmer for the patch
  • PSR12.ControlStructures.BooleanOperatorPlacement.FoundMixed error message is now more accurate when using the allowOnly setting
    • Thanks to Vincent Langlet for the patch
  • PSR12.Functions.NullableTypeDeclaration now supports the PHP8 static return type
    • Thanks to Juliette Reinders Folmer for the patch
  • Fixed Squiz.Formatting.OperatorBracket false positive when exiting with a negative number
  • Fixed Squiz.PHP.DisallowComparisonAssignment false positive for methods called on an object
  • Fixed bug #2882 : Generic.Arrays.ArrayIndent can request close brace indent to be less than the statement indent level
  • Fixed bug #2883 : Generic.WhiteSpace.ScopeIndent.Incorrect issue after NOWDOC
  • Fixed bug #2975 : Undefined offset in PSR12.Functions.ReturnTypeDeclaration when checking function return type inside ternary
  • Fixed bug #2988 : Undefined offset in Squiz.Strings.ConcatenationSpacing during live coding
    • Thanks to Thiemo Kreuz for the patch
  • Fixed bug #2989 : Incorrect auto-fixing in Generic.ControlStructures.InlineControlStructure during live coding
    • Thanks to Thiemo Kreuz for the patch
  • Fixed bug #3007 : Directory exclude pattern improperly excludes directories with names that start the same
    • Thanks to Steve Talbot for the patch
  • Fixed bug #3043 : Squiz.WhiteSpace.OperatorSpacing false positive for negation in arrow function
    • Thanks to Juliette Reinders Folmer for the patch
  • Fixed bug #3049 : Incorrect error with arrow function and parameter passed as reference
    • Thanks to Juliette Reinders Folmer for the patch
  • Fixed bug #3053 : PSR2 incorrect fix when multiple use statements on same line do not have whitespace between them
  • Fixed bug #3058 : Progress gets unaligned when 100% happens at the end of the available dots
  • Fixed bug #3059 : Squiz.Arrays.ArrayDeclaration false positive when using type casting
    • Thanks to Sergei Morozov for the patch
  • Fixed bug #3060 : Squiz.Arrays.ArrayDeclaration false positive for static functions
    • Thanks to Sergei Morozov for the patch
  • Fixed bug #3065 : Should not fix Squiz.Arrays.ArrayDeclaration.SpaceBeforeComma if comment between element and comma
    • Thanks to Sergei Morozov for the patch
  • Fixed bug #3066 : No support for namespace operator used in type declarations
    • Thanks to Juliette Reinders Folmer for the patch
  • Fixed bug #3075 : PSR12.ControlStructures.BooleanOperatorPlacement false positive when operator is the only content on line
  • Fixed bug #3099 : Squiz.WhiteSpace.OperatorSpacing false positive when exiting with negative number
    • Thanks to Sergei Morozov for the patch
  • Fixed bug #3102 : PSR12.Squiz.OperatorSpacing false positive for default values of arrow functions
    • Thanks to Juliette Reinders Folmer for the patch
  • Fixed bug #3124 : PSR-12 not reporting error for empty lines with only whitespace
  • Fixed bug #3135 : Ignore annotations are broken on PHP 8.0
    • Thanks to Juliette Reinders Folmer for the patch