Skip to content

3.8.0 - 2023-12-08

Compare
Choose a tag to compare
@jrfnl jrfnl released this 08 Dec 13:16
· 899 commits to master since this release
3.8.0
5805f7a

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
    • Generic.Formatting.SpaceAfterCast
    • Generic.Formatting.SpaceAfterNot
    • Generic.WhiteSpace.SpreadOperatorSpacingAfter
    • Squiz.Arrays.ArrayDeclaration
    • Squiz.Commenting.DocCommentAlignment
    • Squiz.ControlStructures.ControlSignature
    • Thanks to Danny van der Sluijs (@DannyvdSluijs) and Juliette Reinders Folmer (@jrfnl) for the patches
  • Improved README syntax highlighting
  • Various documentation improvements

Removed

  • Removed support for installation via PEAR
    • Use composer or the PHAR files instead

Fixed

  • Fixed bug #2857 : Squiz/NonExecutableCode: prevent false positives when exit is used in a ternary expression or as default with null coalesce
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3386 : PSR1/SideEffects : improved recognition of disable/enable annotations
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3557 : Squiz.Arrays.ArrayDeclaration will now ignore PHP 7.4 array unpacking when determining whether an array is associative
    • Thanks to Volker Dusch (@edorian) for the patch
  • Fixed bug #3592 : Squiz/NonExecutableCode: prevent false positives when a PHP 8.0+ inline throw expression is encountered
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3715 : Generic/UnusedFunctionParameter: fixed incorrect errorcode for closures/arrow functions nested within extended classes/classes which implement
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3717 : Squiz.Commenting.FunctionComment: fixed false positive for InvalidNoReturn when type is never
    • Thanks to Choraimy Kroonstuiver (@axlon) for the patch
  • Fixed bug #3720 : Generic/RequireStrictTypes : will now bow out silently in case of parse errors/live coding instead of throwing false positives/false negatives
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3720 : Generic/RequireStrictTypes : did not handle multi-directive declare statements
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3722 : Potential "Uninitialized string offset 1" in octal notation backfill
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3736 : PEAR/FunctionDeclaration: prevent fixer removing the close brace (and creating a parse error) when there is no space between the open brace and close brace of a function
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3739 : PEAR/FunctionDeclaration: prevent fixer conflict, and potentially creating a parse error, for unconventionally formatted return types
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3770 : Squiz/NonExecutableCode: prevent false positives for switching between PHP and HTML
    • Thanks to Dan Wallis (@fredden) for the patch
  • Fixed bug #3773 : Tokenizer/PHP: tokenization of the readonly keyword when used in combination with PHP 8.2 disjunctive normal types
    • Thanks to Dan Wallis (@fredden) and Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3776 : Generic/JSHint: error when JSHint is not available
    • Thanks to Dan Wallis (@fredden) for the patch
  • Fixed bug #3777 : Squiz/NonExecutableCode: slew of bug fixes, mostly related to modern PHP
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3778 : Squiz/LowercasePHPFunctions: bug fix for class names in attributes
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3779 : Generic/ForbiddenFunctions: bug fix for class names in attributes
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3785 : Squiz.Commenting.FunctionComment: potential "Uninitialized string offset 0" when a type contains a duplicate pipe symbol
    • Thanks to Dan Wallis (@fredden) for the patch
  • Fixed bug #3787 : PEAR/Squiz/[MultiLine]FunctionDeclaration: allow for PHP 8.1 new in initializers
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3789 : Incorrect tokenization for ternary operator with match inside of it
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3790 : PSR12/AnonClassDeclaration: prevent fixer creating parse error when there was no space before the open brace
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3797 : Tokenizer/PHP: more context sensitive keyword fixes
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3801 : File::getMethodParameters(): allow for readonly promoted properties without visibility
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3805 : Generic/FunctionCallArgumentSpacing: prevent fixer conflict over PHP 7.3+ trailing comma's in function calls
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3806 : Squiz.PHP.InnerFunctions sniff now correctly reports inner functions declared within a closure
  • Fixed bug #3809 : GitBlame report was broken when passing a basepath
  • Fixed bug #3813 : Squiz.Commenting.FunctionComment: false positive for parameter name mismatch on parameters annotated as passed by reference
    • Thanks to Dan Wallis (@fredden) for the patch
  • Fixed bug #3833 : Generic.PHP.LowerCaseType: fixed potential undefined array index notice
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3846 : PSR2.Classes.ClassDeclaration.CloseBraceAfterBody : fixer will no longer remove indentation on the close brace line
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3854 : Fatal error when using Gitblame report in combination with --basepath and running from project subdirectory
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3856 : PSR12.Traits.UseDeclaration was using the wrong error code - SpacingAfterAs - for spacing issues after the use keyword
    • These will now be reported using the SpacingAfterUse error code
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3856 : PSR12.Traits.UseDeclaration did not check spacing after use keyword for multi-line trait use statements
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3867 : Tokenizer/PHP: union type and intersection type operators were not correctly tokenized for static properties without explicit visibility
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3877 : Filter names can be case-sensitive. The -h help text will now display the correct case for the available filters
  • Fixed bug #3893 : Generic/DocComment : the SpacingAfterTagGroup fixer could accidentally remove ignore annotations
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3898 : Squiz/NonExecutableCode : the sniff could get confused over comments in unexpected places
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3904 : Squiz/FunctionSpacing : prevent potential fixer conflict
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch
  • Fixed bug #3906 : Tokenizer/CSS: bug fix related to the unsupported slash comment syntax
    • Thanks to Dan Wallis (@fredden) for the patch
  • Fixed bug #3913 : Config did not always correctly store unknown "long" arguments in the $unknown property
    • Thanks to Juliette Reinders Folmer (@jrfnl) for the patch

Thanks go to Dan Wallis (@fredden) and Danny van der Sluijs (@DannyvdSluijs) for reviewing quite a few of the PRs for this release.
Additionally, thanks to Alexander Turek (@derrabus) for consulting on the repo change over.