Skip to content

Releases: PHPCSStandards/PHP_CodeSniffer

4.0.0beta1

11 May 04:53
4.0.0beta1
b370661
Compare
Choose a tag to compare
4.0.0beta1 Pre-release
Pre-release

Added

  • Files without extension can now be scanned if the path is passed in directly. #2916
    • Previously, files without extension would always be ignored.
    • Now, files with no extension are checked if explicitly passed on the command line or specified in a ruleset.
    • Files without extension will still be ignored when scanning directories recursively.
  • Support for extending a default value for an array property on a sniff from an XML ruleset file. #15
    • Previously, using extend="true" on an property tag for setting an array value could already extend a property value set elsewhere in an (inluded) ruleset.
    • Now, you can also add to (extend) a default value as set on the sniff itself.
    • Note: the property default value and the values set via the ruleset will be merged.
      • This also means that for associative arrays, you can redefine the value for a particular array key.
      • For numerically indexed arrays, this means the array will be renumbered. Keep this in mind if the numeric indexes hold meaning.
  • Added support for PHP 8.4 properties in interfaces to File::getMemberProperties(). #2455
    • Note: properties in interfaces is not fully supported yet, it is just this one method which handles them correctly at this moment.
  • Tokens::NAME_TOKENS containing an array with the tokens used for identifier names. #3041
  • New sniff Generic.WhiteSpace.GotoTargetSpacing to enforce no space between the label of a goto target and the colon following it. #1026
  • An error message is now displayed if no files were checked during a run. #1595
    • This occurs when all of the specified files matched exclusion rules, or none matched filtering rules.
  • An error will be shown when attempting to change an unchangable PHP ini setting using -d option[=value] or via the ruleset with <ini name=...>. #416
    • Previously, this was silently ignored.
    • Attempting to change non-existent ini settings (typo, extension not loaded) will continue to be silently ignored.

Changed

  • The minimum required PHP version has changed from 5.4.0 to 7.2.0.
  • The default coding standard has changed from PEAR to PSR12.
  • Both phpcs as well as phpcbf will now exit with exit code 0 if no issues were found/remain after fixing. #184
    • Non auto-fixable issues can be ignored for the exit code determination by setting the new ignore_non_auto_fixable_on_exit config flag to 1.
    • For full details on the new exit codes, please refer to the Uncyclo "Advanced Usage" page.
  • Composer installs no longer include any test files. #1908
    • The test framework files will still be included to allow for use by external standards.
  • All status, debug, and progress output is now sent to STDERR instead of STDOUT. #1612
    • Only report output now goes through STDOUT. As a result of this, piping output to a file will now only include report output.
      • Pipe both STDERR and STDOUT to the same file to capture the entire output of the run.
    • The --report-file functionality remains untouched.
    • With this change in place, timing and memory consumption stats will now be displayed more often as this will no longer interfere with reports.
  • The --extensions command line argument no longer accepts the tokenizer along with the extension. #2448
    • Previously, you would check .module files as PHP files using --extensions=module/php.
    • Now, you use --extensions=module.
  • When processing rulesets, <config> directives will be applied based on the nesting level of the ruleset. #2197
    • Previously, it was not possible to overrule a <config> directive set in an included ruleset from the "root" ruleset.
    • Now, <config> directives set in the "root" ruleset will always "win" over directives in included rulesets.
    • When two included rulesets at the same nesting level both set the same directive, the value from the last included ruleset "wins" (= same as before).
  • When processing rulesets, <arg> directives will be applied based on the nesting level of the ruleset. #2395, #2597, #2602
    • Previously, it was not possible to overrule a <arg> directive set in an included ruleset from the "root" ruleset.
    • Now, <arg> directives set in the "root" ruleset will always "win" over directives in included rulesets.
    • When two included rulesets at the same nesting level both set the same directive, the value from the first included ruleset "wins" (= same as before).
  • Internal errors will no longer be suppressed when the --sniffs CLI argument is used. #98
  • The File::getDeclarationName() method will no longer accept T_ANON_CLASS or T_CLOSURE tokens. #3766
    • A RuntimeException will be thrown if these tokens are passed.
  • The File::getDeclarationName() method will now always return a string (or throw an Exception). #1007
    • Previously, the method would return null if the name could not be determined, like during live coding.
      Now it will return an empty string in those situations.
  • The File::getMemberProperties() method will no longer add warnings about possible parse errors. #2455
    • This means the Internal.ParseError.InterfaceHasMemberVar and the Internal.ParseError.EnumHasMemberVar error codes have been removed.
    • The method will now throw a "$stackPtr is not a class member var" RuntimeException for properties declared in enums (parse error).
    • Properties declared in interfaces will be analyzed like all other properties, as these are allowed since PHP 8.4.
  • None of the included sniffs will warn about possible parse errors any more. #2455
    • This improves the experience when the file is being checked inside an editor during live coding.
    • If you want to detect parse errors, use the Generic.PHP.Syntax sniff or a dedicated linter instead.
  • The PEAR + PSR2 FunctionCallSignature sniffs will now also examine anonymous class instantiations with parameters. #47
  • The error code Squiz.Classes.ValidClassName.NotCamelCaps has been changed to Squiz.Classes.ValidClassName.NotPascalCase. #2046
    • This reflects that the sniff is actually checking for ClassName and not className.
  • The error code Squiz.PHP.Heredoc.NotAllowed has been replaced by Squiz.PHP.Heredoc.HeredocNotAllowed and Squiz.PHP.Heredoc.NowdocNotAllowed. #2318
    • This allows for forbidding either heredocs or nowdocs without forbidding both.
  • The PSR12.Files.FileHeader sniff now has more modular error codes to allow for more selectively applying the rules. #2729 #3453
    • The PSR12.Files.FileHeader.SpacingAfterBlock error code is replaced by:
      • PSR12.Files.FileHeader.SpacingAfterTagBlock
      • PSR12.Files.FileHeader.SpacingAfterDocblockBlock
      • PSR12.Files.FileHeader.SpacingAfterDeclareBlock
      • PSR12.Files.FileHeader.SpacingAfterNamespaceBlock
      • PSR12.Files.FileHeader.SpacingAfterUseBlock
      • PSR12.Files.FileHeader.SpacingAfterUseFunctionBlock
      • PSR12.Files.FileHeader.SpacingAfterUseConstBlock
    • The PSR12.Files.FileHeader.SpacingInsideBlock error code is replaced by:
      • PSR12.Files.FileHeader.SpacingInsideUseBlock
      • PSR12.Files.FileHeader.SpacingInsideUseFunctionBlock
      • PSR12.Files.FileHeader.SpacingInsideUseConstBlock
  • The error code Squiz.Commenting.VariableComment.TagNotAllowed has been replaced by a dynamic Squiz.Commenting.VariableComment.[TagName]TagNotAllowed error code. #1039
    • This allows for selectively allowing specific tags by excluding the error code for that tag.
    • Example: to allow @link tags in property docblocks, exclude the Squiz.Commenting.VariableComment.LinkTagNotAllowed error code.
  • The following sniffs have received performance related improvements:
    • PEAR.NamingConventions.ValidVariableName
    • PSR2.Classes.PropertyDeclaration
    • Squiz.Commenting.VariableComment
    • Squiz.Scope.MemberVarScope
    • Squiz.WhiteSpace.MemberVarSpacing
    • These sniffs will no longer listen to non-variable tokens, nor for variables tokens outside of OO context. #374
      External sniffs which extend one of these sniffs may need adjustment if they want to retain the old behaviour.
  • PHPCS now uses the PHP >= 8.0 native method for tokenizing (namespaced) identifier names. #3041
    • Before PHP 8.0, PHP would tokenize namespaced names using T_STRING and T_NS_SEPARATOR.
    • From PHP 8.0, PHP uses the tokens T_NAME_FULLY_QUALIFIED, T_NAME_RELATIVE, and T_NAME_QUALIFIED instead.
    • PHPCS now uses these new PHP 8.0 tokens no matter what version of PHP is being used to run PHPCS.
      ...
Read more

3.13.0 - 2025-05-11

11 May 04:51
3.13.0
65ff248
Compare
Choose a tag to compare

Added

  • Added support for PHP 8.4 asymmetric visibility modifiers to the tokenizer. #871
  • Added support for PHP 8.4 final properties to the following sniffs:

Changed

  • Generic.WhiteSpace.LanguageConstructSpacing: will now also check the spacing after the goto language construct keyword. #917
  • The PSR2.Classes.PropertyDeclaration will now check that the final modifier keyword is placed before a visibility keyword. #950
  • Improved Help information about the --reports CLI flag. #1078
  • The documentation for the following sniffs has been improved:
    • PSR1.Files.SideEffects
    • PSR2.ControlStructures.SwitchDeclaration
    • PSR2.Namespaces.NamespaceDeclaration
    • Thanks to Rodrigo Primo for the patches.
  • Various housekeeping, including improvements to the tests and documentation.

Deprecated

  • Nearly everything which was soft deprecated before is now hard deprecated and will show deprecation notices:
    • This applies to:
      • All sniffs which will be removed in 4.0. #888
      • The deprecated Generator methods. #889
      • The old array property setting format (via comma separated strings). #890
      • Sniffs not implementing the PHP_CodeSniffer\Sniffs\Sniff interface. #891
      • Sniffs not following the naming conventions. #892
      • Standards called Internal. #893
      • Sniffs which don't listen for PHP, like JS/CSS specific sniffs. #894
    • The deprecation notices can be silenced by using the -q (=quiet) CLI flag.
    • Thanks to Juliette Reinders Folmer for the patches.

Fixed

  • Fixed bug #1040 : Generic.Strings.UnnecessaryHeredoc - false positive for heredocs containing escape sequences.
  • Fixed bug #1040 : Generic.Strings.UnnecessaryHeredoc - fixer would not clean up escape sequences which aren't necessary in nowdocs.
  • Fixed bug #1048 : A file under scan would sometimes be updated with partial fixes, even though the file "failed to fix".

Other

Calling all testers!

The first beta release for PHP_CodeSniffer 4.0 has been tagged. Please help by testing the beta release and reporting any issues you run into.
Upgrade guides for both ruleset maintainers/end-users, as well as for sniff developers and integrators, have been published to the Uncyclo to help smooth the transition.


Statistics

Closed: 3 issues
Merged: 29 pull requests

Follow @phpcs on Mastodon or @PHP_CodeSniffer on X to stay informed.

Please consider funding the PHP_CodeSniffer project. If you already do so: thank you!

3.12.2 - 2025-04-13

13 Apr 04:49
3.12.2
6d4cf60
Compare
Choose a tag to compare

Added

  • Added support for PHP 8.4 final properties to the following sniffs:
    • Generic.PHP.LowerCaseConstant #948
    • Generic.PHP.UpperCaseConstant #948
    • Squiz.Commenting.DocCommentAlignment #951
    • Squiz.Commenting.VariableComment #949
    • Thanks to Juliette Reinders Folmer for the patches.

Changed

  • Tokenizer/PHP: a PHP open tag at the very end of a file will now always be tokenized as T_OPEN_TAG, independently of the PHP version. #937
    • Previously, a PHP open tag at the end of a file was not tokenized as an open tag on PHP < 7.4 and the tokenization would depend on the short_open_tag setting.
    • Thanks to Juliette Reinders Folmer for the patch.
  • PEAR.Commenting.FunctionComment: improved message for "blank lines between docblock and declaration" check. #830
  • The documentation for the following sniffs has been improved:
    • Generic.Functions.OpeningFunctionBraceBsdAllman
    • Generic.Functions.OpeningFunctionBraceKernighanRitchie
    • Generic.WhiteSpace.LanguageConstructSpacing
    • Thanks to Rodrigo Primo for the patches.
  • Various housekeeping, including improvements to the tests and documentation.

Fixed

  • Fixed bug #830 : PEAR.Commenting.FunctionComment will no longer remove blank lines within attributes.
  • Fixed bug #929 : Generic.PHP.ForbiddenFunctions: prevent false positives/negatives for code interlaced with comments.
  • Fixed bug #934 : Generic.PHP.LowerCaseConstant and Generic.PHP.UpperCaseConstant will now correctly ignore DNF types for properties.
  • Fixed bug #936 : Squiz.Commenting.FunctionCommentThrowTag: sniff would bow out when function has attributes attached, leading to false negatives.
  • Fixed bug #940 : Squiz.Commenting.VariableComment: false positive for missing docblock for properties using DNF types.
  • Fixed bug #944 : Squiz.Commenting.FunctionComment did not support DNF/intersection types in @param tags.
  • Fixed bug #945 : Squiz.WhiteSpace.FunctionSpacing would get confused when there are two docblocks above a function declaration.
  • Fixed bug #947 : Squiz.Commenting.FunctionCommentThrowTag: prevent false positives/negatives for code interlaced with comments.
  • Fixed bug #951 : Squiz.Commenting.DocCommentAlignment did not examine docblocks for final classes.
  • Fixed bug #955 : Potential race condition, leading to a fatal error, when both the Diff + the Code reports are requested and caching is on.
  • Fixed bug #956 : Generic.WhiteSpace.ScopeIndent: undefined array index notice when running in debug mode.

Other

  • PHP_CodeSniffer 4.0 is coming soon! Interested in a sneak peek ? Join the live stream at any time on April 14, 15, 17 or 18.
    Read the open invitation (#924) for all the details.

New Contributors

The PHP_CodeSniffer project is happy to welcome the following new contributors:
@devfrey

Statistics

Closed: 1 issues
Merged: 36 pull requests

Follow @phpcs on Mastodon or @PHP_CodeSniffer on X to stay informed.

Please consider funding the PHP_CodeSniffer project. If you already do so: thank you!

3.12.1 - 2025-04-04

04 Apr 13:45
3.12.1
ea16a1f
Compare
Choose a tag to compare

Added

  • Documentation for the following sniffs:
    • Squiz.Commenting.BlockComment
    • Thanks to Colin Stewart for the patch.

Changed

Deprecated

  • The Generic.Functions.CallTimePassByReference sniff. See #921.
    • This sniff will be removed in version 4.0.0.

Fixed

  • Fixed bug #906 : Fixer: prevent InvalidArgumentExceptions when displaying verbose information.
  • Fixed bug #907 : Tokenizer/PHP: tokenization of tokens related to union, intersection and DNF types in combination with PHP 8.4 final properties.
  • Fixed bug #908 : Tokenizer/PHP: tokenization of ? in nullable types for readonly properties.
  • Fixed bug #916 : Tokenizer/PHP: goto was not recognized as a terminating statement for a case/default in a switch control structure.

Other

  • PHP_CodeSniffer 4.0 is coming soon! Interested in a sneak peek ? Join the live stream at any time on April 14, 15, 17 or 18.
    Read the open invitation (#924) for all the details.

New Contributors

The PHP_CodeSniffer project is happy to welcome the following new contributors:
@costdev

Statistics

Closed: 0 issues
Merged: 24 pull requests

Follow @phpcs on Mastodon or @PHP_CodeSniffer on X to stay informed.

Please consider funding the PHP_CodeSniffer project. If you already do so: thank you!

3.12.0 - 2025-03-18

18 Mar 05:58
3.12.0
2d1b63d
Compare
Choose a tag to compare

Added

  • Added support for PHP 8.4 final properties to File::getMemberProperties() through a new is_final array index in the return value. #834
  • Generators/HTML: each section title now has a unique anchor link, which can be copied when hovering over a title. #859
    • This should make sharing a link to a specific section of the documentation more straight-forward.
    • Thanks to Juliette Reinders Folmer for the patch.
  • Documentation for the following sniffs:
    • Squiz.Classes.ClassFileName
    • Squiz.Classes.ValidClassName
    • Thanks to Brian Dunne for the patches.

Changed

  • PHPCBF: the messaging when no fixable errors are found will now distinguish between "No violations" (at all) versus "No fixable errors". #806
  • The -h (Help) option now contains a more extensive list of "config" options which can be set. #809
  • Improved error message when invalid sniff codes are supplied to --sniffs or --exclude command line arguments. #344
  • Improved error message when an invalid generator name is supplied to the --generator command line argument. #709, #771
    • The generator name will now also always be handled case-insensitively, independently of the OS used.
    • Thanks to Rodrigo Primo for the patch.
  • The user will be shown an informative error message for sniffs missing one of the required methods. #873
  • Ruleset processing will now be allowed to run to its conclusion - barring critical errors - before displaying all ruleset errors in one go. #857
    • Previously an error in a ruleset would cause PHPCS to exit immediately and show only one error at a time.
    • Thanks to Juliette Reinders Folmer for the patch.
  • Generators: XML documentation files which don't contain any actual documentation will now silently be ignored. #755
  • Generators: when the title attribute is missing, the documentation generation will now fall back to the sniff name as the title. #820
  • Generators: cleaner output based on the elements of the documentation which are available. #819, #821
  • Generators/HTML: improved display of code tables by using semantic HTML. #854
  • Squiz.Classes.ClassFileName: recommend changing the file name instead of changing the class name. #845
    • This prevents unactionable recommendations due to the file name not translating to a valid PHP symbol name.
    • Thanks to Juliette Reinders Folmer for the patch.
  • Squiz.Functions.FunctionDeclarationArgumentSpacing: incorrect spacing after a comma followed by a promoted property has an improved error message and will now be flagged with the SpacingBeforePropertyModifier or NoSpaceBeforePropertyModifier error codes. #792
    • This was previously already flagged, but using either the SpacingBeforeHint or NoSpaceBeforeHint error code, which was misleading.
    • Thanks to Juliette Reinders Folmer for the patch.
  • Squiz.Functions.FunctionDeclarationArgumentSpacing: the sniff will now also check the spacing after property modifiers for promoted properties in constructor methods. #792
  • Squiz.WhiteSpace.ScopeKeywordSpacing: the sniff will now also check the spacing after the final and abstract modifier keywords. #604
  • The following sniff(s) have received efficiency improvements:
  • Incorrectly set inline properties (in test case files) will be silently ignored again. #884
  • The AbstractMethodUnitTest class will now flag duplicate test case markers in a test case file. #773
  • Various housekeeping, including improvements to the tests and documentation.

Deprecated

All deprecation are slated for removal in PHP_CodeSniffer 4.0.

  • Support for sniffs not implementing the PHPCS Sniff interface. See #694.
  • Support for including sniffs which don't comply with the PHPCS naming conventions (by referencing the sniff file directly). See #689.
  • Support for external standards named "Internal". See #799.
  • The following Generator methods are now (soft) deprecated. See #755:
    • PHP_CodeSniffer\Generators\Text::printTitle() in favour of PHP_CodeSniffer\Generators\Text::getFormattedTitle()
    • PHP_CodeSniffer\Generators\Text::printTextBlock() in favour of PHP_CodeSniffer\Generators\Text::getFormattedTextBlock()
    • PHP_CodeSniffer\Generators\Text::printCodeComparisonBlock() in favour of PHP_CodeSniffer\Generators\Text::getFormattedCodeComparisonBlock()
    • PHP_CodeSniffer\Generators\Markdown::printHeader() in favour of PHP_CodeSniffer\Generators\Markdown::getFormattedHeader()
    • PHP_CodeSniffer\Generators\Markdown::printFooter() in favour of PHP_CodeSniffer\Generators\Markdown::getFormattedFooter()
    • PHP_CodeSniffer\Generators\Markdown::printTextBlock() in favour of PHP_CodeSniffer\Generators\Markdown::getFormattedTextBlock()
    • PHP_CodeSniffer\Generators\Markdown::printCodeComparisonBlock() in favour of PHP_CodeSniffer\Generators\Markdown::getFormattedCodeComparisonBlock()
    • PHP_CodeSniffer\Generators\HTML::printHeader() in favour of PHP_CodeSniffer\Generators\HTML::getFormattedHeader()
    • PHP_CodeSniffer\Generators\HTML::printToc() in favour of PHP_CodeSniffer\Generators\HTML::getFormattedToc()
    • PHP_CodeSniffer\Generators\HTML::printFooter() in favour of PHP_CodeSniffer\Generators\HTML::getFormattedFooter()
    • PHP_CodeSniffer\Generators\HTML::printTextBlock() in favour of PHP_CodeSniffer\Generators\HTML::getFormattedTextBlock()
    • PHP_CodeSniffer\Generators\HTML::printCodeComparisonBlock() in favour of PHP_CodeSniffer\Generators\HTML::getFormattedCodeComparisonBlock()
    • Thanks to Juliette Reinders Folmer for the patch.

Fixed

  • Fixed bug #794 : Generators: prevent fatal error when the XML documentation does not comply with the expected format.
  • Fixed bug #814 : Generic.NamingConventions.ConstructorName: prevent potential fatal errors during live coding.
  • Fixed bug #816 : File::getDeclarationName(): prevent incorrect result for unfinished closures during live coding.
  • Fixed bug #817 : Squiz.Classes.ValidClassName: ignore comments when determining the name to be validated.
  • Fixed bug #825 : Squiz.Classes.ClassDeclaration: false positives when the next thing after a class was a function with an attribute attached.
  • Fixed bug #826 : Squiz.WhiteSpace.FunctionSpacing: prevent incorrect some results when attributes are attached to a function.
  • Fixed bug #827 : PEAR.Functions.FunctionDeclaration: fixer conflict over an unfinished closure during live coding.
  • Fixed bug #828 : Squiz.WhiteSpace.MemberVarSpacing: allow for readonly properties.
  • Fixed bug #832 : Squiz.WhiteSpace.MemberVarSpacing: prevent potential fixer conflict during live coding.
  • Fixed bug #833 : Squiz.PHP.EmbeddedPhp: fixer conflict when a PHP open tag for a multi-line snippet is found on the same line as a single-line embedded PHP snippet.
  • Fixed bug #833 : Squiz.PHP.EmbeddedPhp: incorrect indent calculation in certain specific situa...
Read more

3.11.3 - 2025-01-23

23 Jan 17:38
3.11.3
ba05f99
Compare
Choose a tag to compare

Changed

  • Generic.ControlStructures.InlineControlStructure no longer unnecessarily listens for T_SWITCH tokens. #595
  • Squiz.Functions.FunctionDeclarationArgumentSpacing: improvements to error message for SpaceBeforeComma error. #783
  • The following sniff(s) have received efficiency improvements:
  • Various housekeeping, including improvements to the tests and documentation.

Fixed

  • Fixed bug #620 : Squiz.Functions.FunctionDeclarationArgumentSpacing: newlines after type will now be handled by the fixer. This also prevents a potential fixer conflict.
  • Fixed bug #782 : Tokenizer/PHP: prevent an "Undefined array key" notice during live coding for unfinished arrow functions.
  • Fixed bug #783 : Squiz.Functions.FunctionDeclarationArgumentSpacing: new line after reference token was not flagged nor fixed.
  • Fixed bug #783 : Squiz.Functions.FunctionDeclarationArgumentSpacing: new line after variadic token was not flagged nor fixed.
  • Fixed bug #783 : Squiz.Functions.FunctionDeclarationArgumentSpacing: new line before/after the equal sign for default values was not flagged nor fixed when equalsSpacing was set to 0.
  • Fixed bug #783 : Squiz.Functions.FunctionDeclarationArgumentSpacing: fixer conflict when a new line is found before/after the equal sign for default values and equalsSpacing was set to 1.
  • Fixed bug #783 : Squiz.Functions.FunctionDeclarationArgumentSpacing: fixer for spacing before/after equal sign could inadvertently remove comment.
  • Fixed bug #783 : Squiz.Functions.FunctionDeclarationArgumentSpacing: fixer will now handle comments between the end of a parameter and a comma more cleanly.
  • Fixed bug #784 : Squiz.WhiteSpace.FunctionSpacing: prevent fixer conflict when a multi-line docblock would start on the same line as the function close curly being examined.

Statistics

Closed: 0 issues
Merged: 14 pull requests

If you like to stay informed about releases and more, follow @phpcs on Mastodon or @PHP_CodeSniffer on X.

Please consider funding the PHP_CodeSniffer project. If you already do so: thank you!

3.11.2 - 2024-12-11

11 Dec 17:15
3.11.2
1368f4a
Compare
Choose a tag to compare

Changed

  • Generators/HTML + Markdown: the output will now be empty (no page header/footer) when there are no docs to display. #687
    • This is in line with the Text Generator which already didn't produce output if there are no docs.
    • Thanks to Juliette Reinders Folmer for the patch.
  • Generators/HTML: only display a Table of Contents when there is more than one sniff with documentation. #697
  • Generators/HTML: improved handling of line breaks in <standard> blocks. #723
  • Generators/Markdown: improved compatibility with the variety of available markdown parsers. #722
  • Generators/Markdown: improved handling of line breaks in <standard> blocks. #737
    • This prevents additional paragraphs from being displayed as code blocks.
    • Thanks to Juliette Reinders Folmer for the patch.
  • Generic.NamingConventions.UpperCaseConstantName: the exact token containing the non-uppercase constant name will now be identified with more accuracy. #665
  • Generic.Functions.OpeningFunctionBraceKernighanRitchie: minor improvement to the error message wording. #736
  • Various housekeeping, including improvements to the tests and documentation.

Fixed

  • Fixed bug #527 : Squiz.Arrays.ArrayDeclaration: short lists within a foreach condition should be ignored.
  • Fixed bug #665 : Generic.NamingConventions.UpperCaseConstantName: false positives and false negatives when code uses unconventional spacing and comments when calling define().
  • Fixed bug #665 : Generic.NamingConventions.UpperCaseConstantName: false positive when a constant named DEFINE is encountered.
  • Fixed bug #665 : Generic.NamingConventions.UpperCaseConstantName: false positive for attribute class called define.
  • Fixed bug #665 : Generic.NamingConventions.UpperCaseConstantName: false positive when handling the instantiation of a class named define.
  • Fixed bug #688 : Generators/Markdown could leave error_reporting in an incorrect state.
  • Fixed bug #698 : Generators/Markdown : link in the documentation footer would not parse as a link.
  • Fixed bug #738 : Generators/Text: stray blank lines after code sample titles.
  • Fixed bug #739 : Generators/HTML + Markdown: multi-space whitespace within a code sample title was folded into a single space.

Other

  • On December 1st, one year after the repo was abandoned and revived, a retrospective of the past year was published for funders.
    • This retrospective is publicly available and also provides some insights into what's to come in the new year.

Statistics

Closed: 2 issues
Merged: 52 pull requests

If you like to stay informed about releases and more, follow @phpcs on Mastodon or @PHP_CodeSniffer on X.

Please consider funding the PHP_CodeSniffer project. If you already do so: thank you!

3.11.1 - 2024-11-16

16 Nov 12:35
3.11.1
19473c3
Compare
Choose a tag to compare

Changed

Fixed

  • Fixed bug #674 : Generic.WhiteSpace.HereNowdocIdentifierSpacing broken XML documentation
  • Fixed bug #675 : InvalidArgumentException when a ruleset includes a sniff by file name and the included sniff does not comply with the PHPCS naming conventions.
    • Notwithstanding this fix, it is strongly recommended to ensure custom sniff classes comply with the PHPCS naming conventions.
    • Thanks to Juliette Reinders Folmer for the patch.

New Contributors

The PHP_CodeSniffer project is happy to welcome the following new contributors:
@MatmaRex

Statistics

Closed: 1 issue
Merged: 11 pull requests

If you like to stay informed about releases and more, follow @phpcs on Mastodon or @PHP_CodeSniffer on X.

Please consider funding the PHP_CodeSniffer project. If you already do so: thank you!

3.11.0 - 2024-11-12

12 Nov 11:46
3.11.0
70c08f8
Compare
Choose a tag to compare

Added

  • Runtime support for PHP 8.4. All known PHP 8.4 deprecation notices have been fixed.
    • Syntax support for new PHP 8.4 features will follow in a future release.
    • If you find any PHP 8.4 deprecation notices which were missed, please report them.
    • Thanks to Juliette Reinders Folmer for the patches.
  • Tokenizer support for PHP 8.3 "yield from" expressions with a comment between the keywords. #529, #647
    • Sniffs explicitly handling T_YIELD_FROM tokens may need updating. The PR description contains example code for use by sniff developers.
    • Additionally, the following sniff has been updated to support "yield from" expressions with comments:
      • Generic.WhiteSpace.LanguageConstructSpacing
    • Thanks to Juliette Reinders Folmer for the patch.
  • New Generic.WhiteSpace.HereNowdocIdentifierSpacing sniff. #586, #637
    • Forbid whitespace between the <<< and the identifier string in heredoc/nowdoc start tokens.
    • Thanks to Juliette Reinders Folmer for the patch.
  • New Generic.Strings.UnnecessaryHeredoc sniff. #633
    • Warns about heredocs without interpolation or expressions in the body text and can auto-fix these to nowdocs.
    • Thanks to Juliette Reinders Folmer for the patch.
  • Documentation for the following sniffs:

Changed

  • The Common::getSniffCode() method will now throw an InvalidArgumentException exception if an invalid $sniffClass is passed. #524, #625
  • Documentation generated using the --generator=... feature will now always be presented in natural order based on the sniff name(s). #668
  • Minor improvements to the display of runtime information. #658
  • Squiz.Commenting.PostStatementComment: trailing annotations in PHP files will now be reported under a separate, non-auto-fixable error code AnnotationFound. #560, #627
    • This prevents (tooling related) annotations from taking on a different meaning when moved by the fixer.
    • The separate error code also allows for selectively excluding it to prevent the sniff from triggering on trailing annotations, while still forbidding other trailing comments.
    • Thanks to Rodrigo Primo for the patch.
  • Squiz.ControlStructures.ForEachLoopDeclaration: the SpacingAfterOpen error code has been replaced by the SpaceAfterOpen error code. The latter is a pre-existing code. The former appears to have been a typo. #582
  • The following sniff(s) have received efficiency improvements:
  • Various housekeeping, including improvements to the tests and documentation.

Fixed

  • Fixed bug #3808 : Generic.WhiteSpace.ScopeIndent would throw false positive for tab indented multi-token yield from expression.
  • Fixed bug #630 : The tokenizer could inadvertently transform "normal" parentheses to DNF parentheses, when a function call was preceded by a switch-case / alternative syntax control structure colon.
  • Fixed bug #645 : On PHP 5.4, if yield was used as the declaration name for a function declared to return by reference, the function name would incorrectly be tokenized as T_YIELD instead of T_STRING.
  • Fixed bug #647 : Tokenizer not applying tab replacement in single token "yield from" keywords.
  • Fixed bug #647 : Generic.WhiteSpace.DisallowSpaceIndent did not flag space indentation in multi-line yield from.
  • Fixed bug #647 : Generic.WhiteSpace.DisallowTabIndent did not flag tabs inside yield from.
  • Fixed bug #652 : Generic.NamingConventions.ConstructorName: false positives for PHP-4 style calls to PHP-4 style parent constructor when a method with the same name as the parent class was called on another class.
  • Fixed bug #652 : Generic.NamingConventions.ConstructorName: false negatives for PHP-4 style calls to parent constructor for function calls with whitespace and comments in unconventional places.
  • Fixed bug #653 : Generic.Classes.DuplicateClassName : the sniff did not skip namespace keywords used as operators, which could lead to false positives.
  • Fixed bug #653 : Generic.Classes.DuplicateClassName : sniff going into an infinite loop during live coding.
  • Fixed bug #653 : Generic.Classes.DuplicateClassName : false positives/negatives when a namespace declaration contained whitespace or comments in unconventional places.
  • Fixed bug #653 : Generic.Classes.DuplicateClassName : namespace for a file going in/out of PHP was not remembered/applied correctly.

Statistics

Closed: 4 issues
Merged: 42 pull requests

If you like to stay informed about releases and more, follow @phpcs on Mastodon or @PHP_CodeSniffer on X.

Please consider funding the PHP_CodeSniffer project. If you already do so: thank you!

3.10.3 - 2024-09-18

18 Sep 11:15
3.10.3
62d3299
Compare
Choose a tag to compare

Changed

Fixed

  • Fixed bug #553 : Squiz.Classes.SelfMemberReference: false negative(s) when namespace operator was encountered between the namespace declaration and the OO declaration.
  • Fixed bug #579 : AbstractPatternSniff: potential PHP notice during live coding.
  • Fixed bug #580 : Squiz.Formatting.OperatorBracket: potential PHP notice during live coding.
  • Fixed bug #581 : PSR12.ControlStructures.ControlStructureSpacing: prevent fixer conflict by correctly handling multiple empty newlines before the first condition in a multi-line control structure.
  • Fixed bug #585 : Tokenizer not applying tab replacement in heredoc/nowdoc openers.
  • Fixed bug #588 : Squiz.PHP.EmbeddedPhp false positive when checking spaces after a PHP short open tag.
  • Fixed bug #597 : Generic.PHP.LowerCaseKeyword did not flag nor fix non-lowercase anonymous class keywords.
  • Fixed bug #598 : Squiz.PHP.DisallowMultipleAssignments: false positive on assignments to variable property on object stored in array.
  • Fixed bug #608 : Squiz.Functions.MultiLineFunctionDeclaration did not take (parameter) attributes into account when checking for one parameter per line.

Other


New Contributors

The PHP_CodeSniffer project is happy to welcome the following new contributors:
@maryo

Statistics

Closed: 4 issues
Merged: 19 pull requests

If you like to stay informed about releases and more, follow @phpcs on Mastodon or @PHP_CodeSniffer on X.

Please consider funding the PHP_CodeSniffer project. If you already do so: thank you!