- The PHP 7.4
T_FN
token has been made available for older versionsT_FN
represents thefn
string used for arrow functions- The double arrow becomes the scope opener, and uses a new
T_FN_ARROW
token type - The token after the statement (normally a semicolon) becomes the scope closer
- The token is also associated with the opening and closing parenthesis of the statement
- Any functions named
fn
will have aT_FN token
for the function name, but have no scope information - Thanks to Michał Bundyra for the help with this change
- PHP 7.4 numeric separators are now tokenized in the same way when using older PHP versions
- Previously, a number like
1_000
would tokenize asT_LNUMBER (1), T_STRING (_000)
- Now, the number tokenizes as
T_LNUMBER (1_000)
- Sniff developers should consider how numbers with underscores impact their custom sniffs
- Previously, a number like
- The PHPCS file cache now takes file permissions into account
- The cache is now invalidated for a file when its permissions are changed
File::getMethodParameters()
now supports arrow functionsFile::getMethodProperties()
now supports arrow functions- Added
Fixer::changeCodeBlockIndent()
to change the indent of a code block while auto-fixing- Can be used to either increase or decrease the indent
- Useful when moving the start position of something like a closure, where you want the content to also move
- Added
Generic.Files.ExecutableFile
sniff- Ensures that files are not executable
- Thanks to Matthew Peveler for the contribution
Generic.CodeAnalysis.EmptyPhpStatement
now reports unnecessary semicolons after control structure closing braces- Thanks to Vincent Langlet for the patch
Generic.PHP.LowerCaseKeyword
now enforces that thefn
keyword is lowercase- Thanks to Michał Bundyra for the patch
Generic.WhiteSpace.ScopeIndent
now supports static arrow functionsPEAR.Functions.FunctionCallSignature
now adjusts the indent of function argument contents during auto-fixing- Previously, only the first line of an argument was changed, leading to inconsistent indents
- This change also applies to
PSR2.Methods.FunctionCallSignature
PSR2.ControlStructures.ControlStructureSpacing
now checks whitespace before the closing parenthesis of multi-line control structures- Previously, it incorrectly applied the whitespace check for single-line definitions only
PSR12.Functions.ReturnTypeDeclaration
now checks the return type of arrow functions- Thanks to Michał Bundyra for the patch
PSR12.Traits.UseDeclaration
now ensures all trait import statements are grouped together- Previously, the trait import section of the class ended when the first non-import statement was found
- Checking now continues throughout the class to ensure all statements are grouped together
- This also ensures that empty lines are not requested after an import statement that isn't the last one
Squiz.Functions.LowercaseFunctionKeywords
now enforces that thefn
keyword is lowercase- Thanks to Michał Bundyra for the patch
- Fixed bug #2586 : Generic.WhiteSpace.ScopeIndent false positives when indenting open tags at a non tab-stop
- Fixed bug #2638 : Squiz.CSS.DuplicateClassDefinitionSniff sees comments as part of the class name
- Thanks to Raphael Horber for the patch
- Fixed bug #2640 : Squiz.WhiteSpace.OperatorSpacing false positives for some negation operators
- Thanks to Jakub Chábek and Juliette Reinders Folmer for the patch
- Fixed bug #2674 : Squiz.Functions.FunctionDeclarationArgumentSpacing prints wrong argument name in error message
- Fixed bug #2676 : PSR12.Files.FileHeader locks up when file ends with multiple inline comments
- Fixed bug #2678 : PSR12.Classes.AnonClassDeclaration incorrectly enforcing that closing brace be on a line by itself
- Fixed bug #2685 : File::getMethodParameters() setting typeHintEndToken for vars with no type hint
- Thanks to Juliette Reinders Folmer for the patch
- Fixed bug #2694 : AbstractArraySniff produces invalid indices when using ternary operator
- Thanks to Michał Bundyra for the patch
- Fixed bug #2702 : Generic.WhiteSpace.ScopeIndent false positive when using ternary operator with short arrays