Releases: PHPCSStandards/PHP_CodeSniffer
4.0.0beta1
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.
- Previously, using
- 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 agoto
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
toPSR12
. - Both
phpcs
as well asphpcbf
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 to1
. - For full details on the new exit codes, please refer to the Uncyclo "Advanced Usage" page.
- Non auto-fixable issues can be ignored for the exit code determination by setting the new
- 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.
- Only report output now goes through STDOUT. As a result of this, piping output to a file will now only include report output.
- 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
.
- Previously, you would check
- 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).
- Previously, it was not possible to overrule a
- 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).
- Previously, it was not possible to overrule a
- Internal errors will no longer be suppressed when the
--sniffs
CLI argument is used. #98 - The
File::getDeclarationName()
method will no longer acceptT_ANON_CLASS
orT_CLOSURE
tokens. #3766- A
RuntimeException
will be thrown if these tokens are passed.
- A
- 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.
- Previously, the method would return
- The
File::getMemberProperties()
method will no longer add warnings about possible parse errors. #2455- This means the
Internal.ParseError.InterfaceHasMemberVar
and theInternal.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.
- This means the
- 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 toSquiz.Classes.ValidClassName.NotPascalCase
. #2046- This reflects that the sniff is actually checking for
ClassName
and notclassName
.
- This reflects that the sniff is actually checking for
- The error code
Squiz.PHP.Heredoc.NotAllowed
has been replaced bySquiz.PHP.Heredoc.HeredocNotAllowed
andSquiz.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
- The error code
Squiz.Commenting.VariableComment.TagNotAllowed
has been replaced by a dynamicSquiz.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 theSquiz.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
andT_NS_SEPARATOR
. - From PHP 8.0, PHP uses the tokens
T_NAME_FULLY_QUALIFIED
,T_NAME_RELATIVE
, andT_NAME_QUALIFIED
instead. - PHPCS now uses these new PHP 8.0 tokens no matter what version of PHP is being used to run PHPCS.
...
- Before PHP 8.0, PHP would tokenize namespaced names using
3.13.0 - 2025-05-11
Added
- Added support for PHP 8.4 asymmetric visibility modifiers to the tokenizer. #871
- Thanks to Daniel Scherzer for the patch.
- Added support for PHP 8.4
final
properties to the following sniffs:- PSR2.Classes.PropertyDeclaration #950
- Thanks to Juliette Reinders Folmer for the patches.
Changed
- Generic.WhiteSpace.LanguageConstructSpacing: will now also check the spacing after the
goto
language construct keyword. #917- Thanks to Juliette Reinders Folmer for the patch.
- The PSR2.Classes.PropertyDeclaration will now check that the
final
modifier keyword is placed before a visibility keyword. #950- Errors will be reported via a new
FinalAfterVisibility
error code. - Thanks to Juliette Reinders Folmer for the patch.
- Errors will be reported via a new
- Improved Help information about the
--reports
CLI flag. #1078- Thanks to Juliette Reinders Folmer for the patch.
- 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.
- Thanks to Juliette Reinders Folmer for their contributions.
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.
- This applies to:
Fixed
- Fixed bug #1040 : Generic.Strings.UnnecessaryHeredoc - false positive for heredocs containing escape sequences.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #1040 : Generic.Strings.UnnecessaryHeredoc - fixer would not clean up escape sequences which aren't necessary in nowdocs.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #1048 : A file under scan would sometimes be updated with partial fixes, even though the file "failed to fix".
- Thanks to Juliette Reinders Folmer for the patch.
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
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.
- 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
- 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.
- Thanks to Rodrigo Primo and Juliette Reinders Folmer for their contributions.
Fixed
- Fixed bug #830 : PEAR.Commenting.FunctionComment will no longer remove blank lines within attributes.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #929 : Generic.PHP.ForbiddenFunctions: prevent false positives/negatives for code interlaced with comments.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #934 : Generic.PHP.LowerCaseConstant and Generic.PHP.UpperCaseConstant will now correctly ignore DNF types for properties.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #936 : Squiz.Commenting.FunctionCommentThrowTag: sniff would bow out when function has attributes attached, leading to false negatives.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #940 : Squiz.Commenting.VariableComment: false positive for missing docblock for properties using DNF types.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #944 : Squiz.Commenting.FunctionComment did not support DNF/intersection types in
@param
tags.- Thanks to Jeffrey Angenent for the patch.
- Fixed bug #945 : Squiz.WhiteSpace.FunctionSpacing would get confused when there are two docblocks above a function declaration.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #947 : Squiz.Commenting.FunctionCommentThrowTag: prevent false positives/negatives for code interlaced with comments.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #951 : Squiz.Commenting.DocCommentAlignment did not examine docblocks for
final
classes.- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #955 : Potential race condition, leading to a fatal error, when both the
Diff
+ theCode
reports are requested and caching is on.- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #956 : Generic.WhiteSpace.ScopeIndent: undefined array index notice when running in debug mode.
- Thanks to Juliette Reinders Folmer for the patch.
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
Added
- Documentation for the following sniffs:
- Squiz.Commenting.BlockComment
- Thanks to Colin Stewart for the patch.
Changed
- Generic.WhiteSpace.HereNowdocIdentifierSpacing: improved error message text.
- Thanks to Juliette Reinders Folmer for the patch.
- Various housekeeping, including improvements to the tests and documentation.
- Thanks to Rodrigo Primo and Juliette Reinders Folmer for their contributions.
Deprecated
- The
Generic.Functions.CallTimePassByReference
sniff. See #921.- This sniff will be removed in version 4.0.0.
Fixed
- Fixed bug #906 : Fixer: prevent
InvalidArgumentException
s when displaying verbose information.- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #907 : Tokenizer/PHP: tokenization of tokens related to union, intersection and DNF types in combination with PHP 8.4 final properties.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #908 : Tokenizer/PHP: tokenization of
?
in nullable types for readonly properties.- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #916 : Tokenizer/PHP:
goto
was not recognized as a terminating statement for a case/default in a switch control structure.- Thanks to Juliette Reinders Folmer for the patch.
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
Added
- Added support for PHP 8.4 final properties to File::getMemberProperties() through a new
is_final
array index in the return value. #834- Thanks to Daniel Scherzer for the patch.
- 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
- Thanks to Peter Wilson for the patch.
- The
-h
(Help) option now contains a more extensive list of "config" options which can be set. #809- Thanks to Juliette Reinders Folmer for the patch.
- Improved error message when invalid sniff codes are supplied to
--sniffs
or--exclude
command line arguments. #344- Thanks to Dan Wallis for the patch.
- 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
- Previously this would result in a fatal error.
- Thanks to Juliette Reinders Folmer for the patch.
- 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
- Thanks to Juliette Reinders Folmer for the patch.
- Generators: when the
title
attribute is missing, the documentation generation will now fall back to the sniff name as the title. #820- Thanks to Juliette Reinders Folmer for the patch.
- Generators: cleaner output based on the elements of the documentation which are available. #819, #821
- Thanks to Juliette Reinders Folmer for the patch.
- Generators/HTML: improved display of code tables by using semantic HTML. #854
- Thanks to Juliette Reinders Folmer for the patch.
- 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
orNoSpaceBeforePropertyModifier
error codes. #792- This was previously already flagged, but using either the
SpacingBeforeHint
orNoSpaceBeforeHint
error code, which was misleading. - Thanks to Juliette Reinders Folmer for the patch.
- This was previously already flagged, but using either the
- Squiz.Functions.FunctionDeclarationArgumentSpacing: the sniff will now also check the spacing after property modifiers for promoted properties in constructor methods. #792
- Thanks to Juliette Reinders Folmer for the patch.
- Squiz.WhiteSpace.ScopeKeywordSpacing: the sniff will now also check the spacing after the
final
andabstract
modifier keywords. #604- Thanks to Klaus Purer for the patch.
- The following sniff(s) have received efficiency improvements:
- Squiz.WhiteSpace.ScopeKeywordSpacing
- Thanks to Juliette Reinders Folmer for the patches.
- Incorrectly set inline properties (in test case files) will be silently ignored again. #884
- This removes the
Internal.PropertyDoesNotExist
error code. - Thanks to Juliette Reinders Folmer for the patch.
- This removes the
- The AbstractMethodUnitTest class will now flag duplicate test case markers in a test case file. #773
- Thanks to Juliette Reinders Folmer for the patch.
- Various housekeeping, including improvements to the tests and documentation.
- Thanks to Asis Pattisahusiwa, Dan Wallis, Rodrigo Primo and Juliette Reinders Folmer for their contributions.
Deprecated
All deprecation are slated for removal in PHP_CodeSniffer 4.0.
- Support for sniffs not implementing the PHPCS
Sniff
interface. See #694.- Thanks to Juliette Reinders Folmer for the patch.
- Support for including sniffs which don't comply with the PHPCS naming conventions (by referencing the sniff file directly). See #689.
- Thanks to Juliette Reinders Folmer for the patch.
- Support for external standards named "Internal". See #799.
- Thanks to Juliette Reinders Folmer for the patch.
- The following Generator methods are now (soft) deprecated. See #755:
PHP_CodeSniffer\Generators\Text::printTitle()
in favour ofPHP_CodeSniffer\Generators\Text::getFormattedTitle()
PHP_CodeSniffer\Generators\Text::printTextBlock()
in favour ofPHP_CodeSniffer\Generators\Text::getFormattedTextBlock()
PHP_CodeSniffer\Generators\Text::printCodeComparisonBlock()
in favour ofPHP_CodeSniffer\Generators\Text::getFormattedCodeComparisonBlock()
PHP_CodeSniffer\Generators\Markdown::printHeader()
in favour ofPHP_CodeSniffer\Generators\Markdown::getFormattedHeader()
PHP_CodeSniffer\Generators\Markdown::printFooter()
in favour ofPHP_CodeSniffer\Generators\Markdown::getFormattedFooter()
PHP_CodeSniffer\Generators\Markdown::printTextBlock()
in favour ofPHP_CodeSniffer\Generators\Markdown::getFormattedTextBlock()
PHP_CodeSniffer\Generators\Markdown::printCodeComparisonBlock()
in favour ofPHP_CodeSniffer\Generators\Markdown::getFormattedCodeComparisonBlock()
PHP_CodeSniffer\Generators\HTML::printHeader()
in favour ofPHP_CodeSniffer\Generators\HTML::getFormattedHeader()
PHP_CodeSniffer\Generators\HTML::printToc()
in favour ofPHP_CodeSniffer\Generators\HTML::getFormattedToc()
PHP_CodeSniffer\Generators\HTML::printFooter()
in favour ofPHP_CodeSniffer\Generators\HTML::getFormattedFooter()
PHP_CodeSniffer\Generators\HTML::printTextBlock()
in favour ofPHP_CodeSniffer\Generators\HTML::getFormattedTextBlock()
PHP_CodeSniffer\Generators\HTML::printCodeComparisonBlock()
in favour ofPHP_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.
- It is recommended to validate XML documentation files against the XSD file: https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #814 : Generic.NamingConventions.ConstructorName: prevent potential fatal errors during live coding.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #816 : File::getDeclarationName(): prevent incorrect result for unfinished closures during live coding.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #817 : Squiz.Classes.ValidClassName: ignore comments when determining the name to be validated.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #825 : Squiz.Classes.ClassDeclaration: false positives when the next thing after a class was a function with an attribute attached.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #826 : Squiz.WhiteSpace.FunctionSpacing: prevent incorrect some results when attributes are attached to a function.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #827 : PEAR.Functions.FunctionDeclaration: fixer conflict over an unfinished closure during live coding.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #828 : Squiz.WhiteSpace.MemberVarSpacing: allow for
readonly
properties.- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #832 : Squiz.WhiteSpace.MemberVarSpacing: prevent potential fixer conflict during live coding.
- Thanks to Juliette Reinders Folmer for the patch.
- 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.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #833 : Squiz.PHP.EmbeddedPhp: incorrect indent calculation in certain specific situa...
3.11.3 - 2025-01-23
Changed
- Generic.ControlStructures.InlineControlStructure no longer unnecessarily listens for T_SWITCH tokens. #595
- Thanks to Rodrigo Primo for the patch.
- Squiz.Functions.FunctionDeclarationArgumentSpacing: improvements to error message for
SpaceBeforeComma
error. #783- Thanks to Juliette Reinders Folmer for the patch.
- The following sniff(s) have received efficiency improvements:
- Squiz.Functions.FunctionDeclarationArgumentSpacing
- Thanks to Dan Wallis and Juliette Reinders Folmer for the patches.
- Various housekeeping, including improvements to the tests and documentation.
- Thanks to Michał Bundyra, Rodrigo Primo and Juliette Reinders Folmer for their contributions.
Fixed
- Fixed bug #620 : Squiz.Functions.FunctionDeclarationArgumentSpacing: newlines after type will now be handled by the fixer. This also prevents a potential fixer conflict.
- Thanks to Dan Wallis for the patch.
- Fixed bug #782 : Tokenizer/PHP: prevent an "Undefined array key" notice during live coding for unfinished arrow functions.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #783 : Squiz.Functions.FunctionDeclarationArgumentSpacing: new line after reference token was not flagged nor fixed.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #783 : Squiz.Functions.FunctionDeclarationArgumentSpacing: new line after variadic token was not flagged nor fixed.
- Thanks to Juliette Reinders Folmer for the patch.
- 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 to0
.- Thanks to Juliette Reinders Folmer for the patch.
- 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 to1
.- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #783 : Squiz.Functions.FunctionDeclarationArgumentSpacing: fixer for spacing before/after equal sign could inadvertently remove comment.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #783 : Squiz.Functions.FunctionDeclarationArgumentSpacing: fixer will now handle comments between the end of a parameter and a comma more cleanly.
- Thanks to Juliette Reinders Folmer for the patch.
- 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.
- Thanks to Klaus Purer for the patch
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
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
- Thanks to Juliette Reinders Folmer for the patch.
- Generators/HTML: improved handling of line breaks in
<standard>
blocks. #723- Thanks to Juliette Reinders Folmer for the patch.
- Generators/Markdown: improved compatibility with the variety of available markdown parsers. #722
- Thanks to Juliette Reinders Folmer for the patch.
- 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
- Thanks to Rodrigo Primo for the patch.
- Generic.Functions.OpeningFunctionBraceKernighanRitchie: minor improvement to the error message wording. #736
- Thanks to Juliette Reinders Folmer for the patch.
- Various housekeeping, including improvements to the tests and documentation.
- Thanks to Rodrigo Primo and Juliette Reinders Folmer for their contributions.
Fixed
- Fixed bug #527 : Squiz.Arrays.ArrayDeclaration: short lists within a foreach condition should be ignored.
- Thanks to Rodrigo Primo for the patch.
- Fixed bug #665 : Generic.NamingConventions.UpperCaseConstantName: false positives and false negatives when code uses unconventional spacing and comments when calling
define()
.- Thanks to Rodrigo Primo for the patch.
- Fixed bug #665 : Generic.NamingConventions.UpperCaseConstantName: false positive when a constant named
DEFINE
is encountered.- Thanks to Rodrigo Primo for the patch.
- Fixed bug #665 : Generic.NamingConventions.UpperCaseConstantName: false positive for attribute class called
define
.- Thanks to Rodrigo Primo for the patch.
- Fixed bug #665 : Generic.NamingConventions.UpperCaseConstantName: false positive when handling the instantiation of a class named
define
.- Thanks to Rodrigo Primo for the patch.
- Fixed bug #688 : Generators/Markdown could leave error_reporting in an incorrect state.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #698 : Generators/Markdown : link in the documentation footer would not parse as a link.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #738 : Generators/Text: stray blank lines after code sample titles.
- Thanks to Juliette Reinders Folmer for the patch.
- Fixed bug #739 : Generators/HTML + Markdown: multi-space whitespace within a code sample title was folded into a single space.
- Thanks to Juliette Reinders Folmer for the patch.
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
Changed
- Output from the
--generator=...
feature will respect the OS-expected EOL char in more places. #671- Thanks to Juliette Reinders Folmer for the patch.
- Various housekeeping, including improvements to the tests and documentation.
- Thanks to Bartosz Dziewoński and Juliette Reinders Folmer for their contributions.
Fixed
- Fixed bug #674 : Generic.WhiteSpace.HereNowdocIdentifierSpacing broken XML documentation
- Thanks to Juliette Reinders Folmer for the patch.
- 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
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.
- Forbid whitespace between the
- 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:
- Generic.Arrays.ArrayIndent
- Squiz.PHP.Heredoc
- Thanks to Rodrigo Primo and Juliette Reinders Folmer for the patches.
Changed
- The Common::getSniffCode() method will now throw an InvalidArgumentException exception if an invalid
$sniffClass
is passed. #524, #625- Thanks to Juliette Reinders Folmer for the patch.
- Documentation generated using the
--generator=...
feature will now always be presented in natural order based on the sniff name(s). #668- Thanks to Juliette Reinders Folmer for the patch.
- Minor improvements to the display of runtime information. #658
- Thanks to Juliette Reinders Folmer for the patch.
- 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 theSpaceAfterOpen
error code. The latter is a pre-existing code. The former appears to have been a typo. #582- Thanks to Dan Wallis for the patch.
- The following sniff(s) have received efficiency improvements:
- Generic.Classes.DuplicateClassName
- Generic.NamingConventions.ConstructorName
- Thanks to Rodrigo Primo and Juliette Reinders Folmer for the patches.
- Various housekeeping, including improvements to the tests and documentation.
- Thanks to Rodrigo Primo and Juliette Reinders Folmer for their contributions.
Fixed
- Fixed bug #3808 : Generic.WhiteSpace.ScopeIndent would throw false positive for tab indented multi-token yield from expression.
- Thanks to Juliette Reinders Folmer for the patch
- 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.
- Thanks to Juliette Reinders Folmer for the patch
- 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.
- Thanks to Juliette Reinders Folmer for the patch
- Fixed bug #647 : Tokenizer not applying tab replacement in single token "yield from" keywords.
- Thanks to Juliette Reinders Folmer for the patch
- Fixed bug #647 : Generic.WhiteSpace.DisallowSpaceIndent did not flag space indentation in multi-line yield from.
- Thanks to Juliette Reinders Folmer for the patch
- Fixed bug #647 : Generic.WhiteSpace.DisallowTabIndent did not flag tabs inside yield from.
- Thanks to Juliette Reinders Folmer for the patch
- 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.
- Thanks to Juliette Reinders Folmer for the patch
- 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.
- Thanks to Juliette Reinders Folmer for the patch
- Fixed bug #653 : Generic.Classes.DuplicateClassName : the sniff did not skip namespace keywords used as operators, which could lead to false positives.
- Thanks to Juliette Reinders Folmer for the patch
- Fixed bug #653 : Generic.Classes.DuplicateClassName : sniff going into an infinite loop during live coding.
- Thanks to Juliette Reinders Folmer for the patch
- Fixed bug #653 : Generic.Classes.DuplicateClassName : false positives/negatives when a namespace declaration contained whitespace or comments in unconventional places.
- Thanks to Juliette Reinders Folmer for the patch
- Fixed bug #653 : Generic.Classes.DuplicateClassName : namespace for a file going in/out of PHP was not remembered/applied correctly.
- Thanks to Juliette Reinders Folmer for the patch
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
Changed
- Various housekeeping, including improvements to the tests and documentation.
- Thanks to Rodrigo Primo and Juliette Reinders Folmer for their contributions.
Fixed
- Fixed bug #553 : Squiz.Classes.SelfMemberReference: false negative(s) when namespace operator was encountered between the namespace declaration and the OO declaration.
- Thanks to Juliette Reinders Folmer for the patch
- Fixed bug #579 : AbstractPatternSniff: potential PHP notice during live coding.
- Thanks to Juliette Reinders Folmer for the patch
- Fixed bug #580 : Squiz.Formatting.OperatorBracket: potential PHP notice during live coding.
- Thanks to Juliette Reinders Folmer for the patch
- 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.
- Thanks to Dan Wallis for the patch.
- Fixed bug #585 : Tokenizer not applying tab replacement in heredoc/nowdoc openers.
- Thanks to Juliette Reinders Folmer for the patch
- Fixed bug #588 : Squiz.PHP.EmbeddedPhp false positive when checking spaces after a PHP short open tag.
- Thanks to Rodrigo Primo for the patch.
- Fixed bug #597 : Generic.PHP.LowerCaseKeyword did not flag nor fix non-lowercase anonymous class keywords.
- Thanks to Marek Štípek for the patch.
- Fixed bug #598 : Squiz.PHP.DisallowMultipleAssignments: false positive on assignments to variable property on object stored in array.
- Thanks to Juliette Reinders Folmer for the patch
- Fixed bug #608 : Squiz.Functions.MultiLineFunctionDeclaration did not take (parameter) attributes into account when checking for one parameter per line.
- Thanks to Juliette Reinders Folmer for the patch
Other
- The provenance of PHAR files associated with a release can now be verified via GitHub Artifact Attestations using the GitHub CLI tool with the following command:
gh attestation verify [phpcs|phpcbf].phar -o PHPCSStandards
. #574- Thanks to Juliette Reinders Folmer for the patch.
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!