github PHPCSStandards/PHP_CodeSniffer 3.12.0
3.12.0 - 2025-03-18

19 hours ago

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 situations.
  • Fixed bug #835 : Generic.PHP.DisallowShortOpenTag: don't act on parse errors.
  • Fixed bug #838 : Squiz.PHP.EmbeddedPhp: no new line before close tag was incorrectly enforced when a preceding OO construct or function had a trailing comment after the close curly.
  • Fixed bug #840 : Squiz.WhiteSpace.MemberVarSpacing: more accurate reporting on blank lines in the property "pre-amble" (i.e. docblock, attributes).
  • Fixed bug #845 : Squiz.Classes.ClassFileName: don't throw an incorrect error for an unfinished OO declaration during live coding.
  • Fixed bug #865 : Setting an array property to an empty array from an XML ruleset now works correctly.
  • Fixed bug #866 : Squiz.WhiteSpace.FunctionOpeningBraceSpace: XML docs were not accessible due to an issue with the file name.

Other

  • A new wiki page is available to clarify the difference between a project ruleset and an external standard.
    • This wiki page also contains detailed information about the naming conventions external standards must comply with.
  • A new XMLLint validate action runner is available which can be used in CI to validate rulesets for PHP_CodeSniffer against the XSD.

New Contributors

The PHP_CodeSniffer project is happy to welcome the following new contributors:
@asispts, @braindawg, @DanielEScherzer, @peterwilsoncc

Statistics

Closed: 5 issues
Merged: 74 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!

Don't miss a new PHP_CodeSniffer release

NewReleases is sending notifications on new releases.