Skip to content

Releases: PHPCSStandards/PHP_CodeSniffer

4.0.1 - 2025-11-10

10 Nov 17:09
Immutable release. Only release title and notes can be modified.
4.0.1
0525c73

Choose a tag to compare

This release includes all improvements and bugfixes from PHP_CodeSniffer 3.13.5.

Added

  • Runtime support for PHP 8.5. All known PHP 8.5 deprecation notices have been fixed.
    • Syntax support for new PHP 8.5 features will follow in a future release.
    • If you find any PHP 8.5 deprecation notices which were missed, please report them.

Changed

  • The Squiz.ControlStructures.SwitchDeclaration sniff will now flag a PHP close tag as a "wrong opener" and will auto-fix this by inserting a colon. #1316
  • Various housekeeping, including improvements to the tests and documentation.

Fixed

  • 4.x regression #1277: bring back whitespace tolerance in phpcs:ignore comma-separated rule reference lists.
    • Note: this bug did not affect phpcs:disable/phpcs:enable ignore annotations.
  • Fixed bug #968: Generic.WhiteSpace.ScopeIndent was reporting false positives - and making incorrect fixes - for lines following a line containing an arrow function.
  • Fixed bug #1216: Tokenizer/PHP: added more defensive coding to prevent PHP 8.5 "Using null as an array offset" deprecation notices.
  • Fixed bug #1279: Tokenizer/PHP: on PHP < 8.0, an unclosed attribute (parse error) could end up removing some tokens from the token stream.
    • This could lead to false positives and false negative from sniffs, but could also lead to incorrect fixes being made mangling the file under scan.
  • Fixed bug #1315: Squiz.ControlStructures.SwitchDeclaration: a number of the fixers would get into fixer conflicts with each other if the code under scan contained multiple statements on a line within a switch.
    • The sniff will now forbid - and auto-fix - multiple statements on one line for case/default and "case breaking" statements.
  • Fixed bug #1316: Tokenizer/PHP: a PHP close tag after a switch case condition or after a default keyword, was not regarded as a "scope_opener" for the case/default body.
  • Fixed bug #1316: PSR2.ControlStructures.SwitchDeclaration: the WrongOpener error is now also auto-fixable if the wrong opener is a PHP close tag.
  • Fixed bug #1316: Squiz.PHP.NonExecutableCode would throw false positives when code within a switch control structure would move in and out of PHP.

New Contributors

The PHP_CodeSniffer project is happy to welcome the following new contributors:
@andrewnicols, @Soh1121

Statistics

Closed: 2 issues
Merged: 8 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.13.5 - 2025-11-04

04 Nov 18:06
Immutable release. Only release title and notes can be modified.
3.13.5
0ca8684

Choose a tag to compare

Added

  • Runtime support for PHP 8.5. All known PHP 8.5 deprecation notices have been fixed.
    • Syntax support for new PHP 8.5 features will follow in a future release.
    • If you find any PHP 8.5 deprecation notices which were missed, please report them.

Changed

Fixed

  • Fixed bug #1216: Tokenizer/PHP: added more defensive coding to prevent PHP 8.5 "Using null as an array offset" deprecation notices.
  • Fixed bug #1279: Tokenizer/PHP: on PHP < 8.0, an unclosed attribute (parse error) could end up removing some tokens from the token stream.
    • This could lead to false positives and false negative from sniffs, but could also lead to incorrect fixes being made mangling the file under scan.
    • Thanks to Juliette Reinders Folmer for the patch.

Other

  • Please be aware that the master branch has been renamed to 3.x and the default branch has changed to the 4.x branch.
    • If you contribute to PHP_CodeSniffer, you will need to update your local git clone.
    • If you develop against PHP_CodeSniffer and run your tests against dev branches of PHPCS, you will need to update your workflows.

New Contributors

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

Statistics

Closed: 2 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!

4.0.0 - 2025-09-16

16 Sep 12:23
Immutable release. Only release title and notes can be modified.
4.0.0
06113cf

Choose a tag to compare

This release contains breaking changes.

Upgrade guides for both ruleset maintainers/end-users, as well as for sniff developers and integrators, have been published to the Wiki.

You are strongly encouraged to read the upgrade guide applicable to your situation before upgrading.

This release includes all improvements and bugfixes from PHP_CodeSniffer 4.0.0-beta1, 4.0.0-RC1, 3.13.3 and 3.13.4.

Changed

  • Tokenizer/PHP: fully qualified exit/die/true/false/null will be tokenized as the keyword token and the token 'content' will include the leading backslash. #1201
  • Wherever possible based on the PHP 7.2 minimum version, parameter types have been added to all methods. #1237
  • The supported PHPUnit version constraints have been updated to ^8.4.0 || ^9.3.4 || ^10.5.32 || 11.3.3 - 11.5.28 || ^11.5.31. #1247
    • External standards using the PHP_CodeSniffer native framework may need to update their own PHPUnit version constraints.
  • Various housekeeping, including improvements to the tests and documentation.

Fixed

  • Fixed bug #1082: new exit codes weren't applied when running phpcbf on code provided via STDIN.
  • Fixed bug #1172: // phpcs:set for inline array properties did not handle a single item array with the value true, false or null correctly.
  • Fixed bug #1174: progress bar wasn't showing files as fixed when running phpcbf in parallel mode.
  • Fixed bug #1226: PHP 8.5 "Using null as an array offset" deprecation notice.

Other

  • Please be aware that the master branch has been renamed to 3.x and the default branch has changed to the 4.x branch.
    • If you contribute to PHP_CodeSniffer, you will need to update your local git clone.
    • If you develop against PHP_CodeSniffer and run your tests against dev branches of PHPCS, you will need to update your workflows.

Statistics

Closed: 5 issues
Merged: 35 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.13.4 - 2025-09-05

05 Sep 06:27
Immutable release. Only release title and notes can be modified.
3.13.4
ad545ea

Choose a tag to compare

Fixed

  • Fixed bug #1213: ability to run tests for external standards using the PHPCS native test framework was broken.
  • Fixed bug #1215: PHP 8.5 "Using null as an array offset" deprecation notices.

Statistics

Closed: 0 issues
Merged: 3 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.13.3 - 2025-09-04

04 Sep 21:05
3.13.3
5be16e1

Choose a tag to compare

Added

  • Tokenizer support for PHP 8.4 dereferencing of new expressions without wrapping parentheses. #1160
  • Tokenizer support for PHP 8.4 abstract properties. #1183
    • The File::getMemberProperties() method now also supports abstract properties through a new is_abstract array index in the return value. #1184
    • Additionally, the following sniffs have been updated to support abstract properties:
      • Generic.PHP.LowerCaseConstant #1185
      • Generic.PHP.UpperCaseConstant #1185
      • PSR2.Classes.PropertyDeclaration #1188
      • Squiz.Commenting.VariableComment #1186
      • Squiz.WhiteSpace.MemberVarSpacing #1187
    • Thanks to Juliette Reinders Folmer for the patches
  • Tokenizer support for the PHP 8.4 "exit as a function call" change. #1201
    • When exit/die is used as a fully qualified "function call", it will now be tokenized as T_NS_SEPARATOR + T_EXIT.
    • Additionally, the following sniff has been updated to handle fully qualified exit/die correctly:
      • Squiz.PHP.NonExecutableCode
    • Thanks to Juliette Reinders Folmer for the patches

Changed

  • Tokenizer/PHP: fully qualified true/false/null will now be tokenized as T_NS_SEPARATOR + T_TRUE/T_FALSE/T_NULL. #1201
    • Previously, these were tokenized as T_NS_SEPARATOR + T_STRING.
    • Additionally, the following sniffs have been updated to handle fully qualified true/false/null correctly:
      • Generic.CodeAnalysis.UnconditionalIfStatement
      • Generic.ControlStructures.DisallowYodaConditions
      • PEAR.Functions.ValidDefaultValue
    • Thanks to Juliette Reinders Folmer for the patches.
  • Generic.PHP.Syntax: the sniff is now able to scan input provided via STDIN on non-Windows OSes. #915
  • PSR2.ControlStructures.SwitchDeclaration: the WrongOpener* error code is now auto-fixable if the identified "wrong opener" is a semi-colon. #1161
  • The PSR2.Classes.PropertyDeclaration will now check that the abstract modifier keyword is placed before a visibility keyword. #1188
    • Errors will be reported via a new AbstractAfterVisibility error code.
    • Thanks to Juliette Reinders Folmer for the patch.
  • Various housekeeping, including improvements to the tests and documentation.

Fixed

  • Fixed bug #1112 : --parallel option fails if PHP_CodeSniffer is invoked via bash and the invokation creates a non-PHPCS-managed process.
  • Fixed bug #1113 : fatal error when the specified "files to scan" would result in the same file being added multiple times to the queue.
    • This error only occured when --parallel scanning was enabled.
    • Thanks to Rodrigo Primo for the patch.
  • Fixed bug #1154 : PEAR.WhiteSpace.ObjectOperatorIndent: false positive when checking multiple chained method calls in a multidimensional array.
  • Fixed bug #1193 : edge case inconsistency in how empty string array keys for sniff properties are handled.
  • Fixed bug #1197 : Squiz.Commenting.FunctionComment: return types containing a class name with underscores would be truncated leading to incorrect results.

Other


New Contributors

The PHP_CodeSniffer project is happy to welcome the following new contributors:
@benno5020, @NanoSector

Statistics

Closed: 11 issues
Merged: 40 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!

4.0.0RC1 - 2025-06-18

17 Jun 23:14
Immutable release. Only release title and notes can be modified.
4.0.0-RC1
ed5e2c2

Choose a tag to compare

4.0.0RC1 - 2025-06-18 Pre-release
Pre-release

This release includes all improvements and bugfixes from PHP_CodeSniffer 4.0.0-beta1, 3.13.1 and 3.13.2.

Changed

  • The error code Squiz.Functions.FunctionDeclarationArgumentSpacing.SpacingAfterVisbility has been changed to Squiz.Functions.FunctionDeclarationArgumentSpacing.SpacingAfterVisibility. #1136
  • The following sniff(s) have received efficiency improvements:
    • Generic.ControlStructures.InlineControlStructure #880
    • Thanks to Rodrigo Primo for the patch.

Fixed

  • Fixed bug #3889 : A selective phpcs:enable could sometimes override a later selective phpcs:ignore.
  • Fixed bug #1128 : missing 'parenthesis_owner' index for T_FUNCTION token on PHP < 7.4 when function is named "fn".

Other

  • The GPG signature for the PHAR files has been rotated. The new fingerprint is: D91D86963AF3A29B6520462297B02DD8E5071466.

Calling all testers!

Please help by testing the RC 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 Wiki to help smooth the transition.


Statistics

Closed: 2 issues
Merged: 4 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.13.2 - 2025-06-18

17 Jun 22:52
3.13.2
5b5e382

Choose a tag to compare

Changed

  • The documentation for the following sniffs has been improved:
    • Squiz.Classes.SelfMemberReference
    • Thanks to Rodrigo Primo for the patch.
  • Various housekeeping, including improvements to the tests and documentation.

Fixed

  • Fixed bug #1135 : Squiz.Functions.FunctionDeclarationArgumentSpacing: typo in new error code SpacingAfterSetVis[i]bility.

Statistics

Closed: 0 issues
Merged: 6 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.13.1 - 2025-06-13

13 Jun 02:17
3.13.1
1b71b4d

Choose a tag to compare

Added

  • Added support for PHP 8.4 properties with asymmetric visibility to File::getMemberProperties() through a new set_scope array index in the return value. #1116
  • Added support for PHP 8.4 (constructor promoted) properties with asymmetric visibility to File::getMethodParameters() through new set_visibility and set_visibility_token array indexes in the return value. #1116
  • Added support for PHP 8.4 asymmetric visibility modifiers to the following sniffs:
    • Generic.PHP.LowerCaseKeyword #1117
    • PEAR.NamingConventions.ValidVariableName #1118
    • PSR2.Classes.PropertyDeclaration #1119
    • Squiz.Commenting.BlockComment #1120
    • Squiz.Commenting.DocCommentAlignment #1120
    • Squiz.Commenting.VariableComment #1120
    • Squiz.Functions.FunctionDeclarationArgumentSpacing #1121
    • Squiz.Scope.MemberVarScope #1122
    • Squiz.WhiteSpace.MemberVarSpacing #1123
    • Squiz.WhiteSpace.ScopeKeywordSpacing #1124
    • Thanks to Juliette Reinders Folmer for the patches.

Changed

  • The PSR2.Classes.PropertyDeclaration will now check that a set-visibility modifier keyword is placed after a potential general visibility keyword. #1119
  • The Squiz.Functions.FunctionDeclarationArgumentSpacing will now check spacing after a set-visibility modifier keyword. #1121
    • Errors will be reported via a new SpacingAfterSetVisibility error code.
    • Thanks to Juliette Reinders Folmer for the patch.
  • The Squiz.Scope.MemberVarScope will now flag missing "read" visibility, when "write" visibility is set, under a separate error code AsymReadMissing. #1122
  • The documentation for the following sniffs has been improved:
    • PEAR.Classes.ClassDeclaration
    • Squiz.WhiteSpace.FunctionOpeningBraceSpace
    • Thanks to Brian Dunne and Rodrigo Primo for the patches.
  • Various housekeeping, including improvements to the tests and documentation.

Other

  • The latest PHP_CodeSniffer XSD file is now available via the following permalink: https://schema.phpcodesniffer.com/phpcs.xsd. #1094
    Older XSD files can be referenced via permalinks based on their minor: https://schema.phpcodesniffer.com/#.#/phpcs.xsd.
  • The GPG signature for the PHAR files has been rotated. The new fingerprint is: D91D86963AF3A29B6520462297B02DD8E5071466.

Statistics

Closed: 3 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!

4.0.0beta1

11 May 04:53
4.0.0beta1
b370661

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 Wiki "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

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 Wiki 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!