Skip to content

Releases: PHPCSStandards/PHP_CodeSniffer

2.3.4 - 2015-09-09

08 Nov 05:34
Compare
Choose a tag to compare
  • JSON report format now includes the fixable status for each error message and the total number of fixable errors
  • Added more guard code for function declarations with syntax errors
  • Added tokenizer support for the PHP declare construct
    • Thanks to Andy Blyler for the patch
  • Generic UnnecessaryStringConcatSniff can now allow strings concatenated over multiple lines
    • Set the allowMultiline property to TRUE (default is FALSE) in your ruleset.xml file to enable this
    • By default, concat used only for getting around line length limits still generates an error
    • Thanks to Stefan Lenselink for the contribution
  • Invalid byte sequences no longer throw iconv_strlen() errors (request #639)
    • Thanks to Willem Stuursma for the patch
  • Generic TodoSniff and FixmeSniff are now better at processing strings with invalid characters
  • PEAR FunctionCallSignatureSniff now ignores indentation of inline HTML content
  • Squiz ControlSignatureSniff now supports control structures with only inline HTML content
  • Fixed bug #636 : Some class names cause CSS tokenizer to hang
  • Fixed bug #638 : VCS blame reports output error content from the blame commands for files not under VC
  • Fixed bug #642 : Method params incorrectly detected when default value uses short array syntax
    • Thanks to Josh Davis for the patch
  • Fixed bug #644 : PEAR ScopeClosingBrace sniff does not work with mixed HTML/PHP
  • Fixed bug #645 : FunctionSignature and ScopeIndent sniffs don't detect indents correctly when PHP open tag is not on a line by itself
  • Fixed bug #648 : Namespace not tokenized correctly when followed by multiple use statements
  • Fixed bug #654 : Comments affect indent check for BSDAllman brace style
  • Fixed bug #658 : Squiz.Functions.FunctionDeclarationSpacing error for multi-line declarations with required spaces greater than zero
    • Thanks to J.D. Grimes for the patch
  • Fixed bug #663 : No space after class name generates: Class name "" is not in camel caps format
  • Fixed bug #667 : Scope indent check can go into infinite loop due to some parse errors
  • Fixed bug #670 : Endless loop in PSR1 SideEffects sniffer if no semicolon after last statement
    • Thanks to Thomas Jarosch for the patch
  • Fixed bug #672 : Call-time pass-by-reference false positive
  • Fixed bug #683 : Comments are incorrectly reported by PSR2.ControlStructures.SwitchDeclaration sniff
  • Fixed bug #687 : ScopeIndent does not check indent correctly for method prefixes like public and abstract
  • Fixed bug #689 : False error on some comments after class closing brace

2.3.3 - 2015-06-24

08 Nov 05:24
Compare
Choose a tag to compare
  • Improved the performance of the CSS tokenizer, especially on very large CSS files (thousands of lines)
    • Thanks to Klaus Purer for the patch
  • Defined tokens for lower PHP versions are now phpcs-specific strings instead of ints
    • Stops conflict with other projects, like PHP_CodeCoverage
  • Added more guard code for syntax errors to various sniffs
  • Improved support for older HHVM versions
    • Thanks to Kunal Mehta for the patch
  • Squiz ValidLogicalOperatorsSniff now ignores XOR as type casting is different when using the ^ operator (request #567)
  • Squiz CommentedOutCodeSniff is now better at ignoring URLs inside comments
  • Squiz ControlSignatureSniff is now better at checking embedded PHP code
  • Squiz ScopeClosingBraceSniff is now better at checking embedded PHP code
  • Fixed bug #584 : Squiz.Arrays.ArrayDeclaration sniff gives incorrect NoComma error for multiline string values
  • Fixed bug #589 : PEAR.Functions.FunctionCallSignature sniff not checking all function calls
  • Fixed bug #592 : USE statement tokenising can sometimes result in mismatched scopes
  • Fixed bug #594 : Tokenizer issue on closure that returns by reference
  • Fixed bug #595 : Colons in CSS selectors within media queries throw false positives
    • Thanks to Klaus Purer for the patch
  • Fixed bug #598 : PHPCBF can break function/use closure brace placement
  • Fixed bug #603 : Squiz ControlSignatureSniff hard-codes opener type while fixing
  • Fixed bug #605 : Auto report-width specified in ruleset.xml ignored
  • Fixed bug #611 : Invalid numeric literal on CSS files under PHP7
  • Fixed bug #612 : Multi-file diff generating incorrectly if files do not end with EOL char
  • Fixed bug #615 : Squiz OperatorBracketSniff incorrectly reports and fixes operations using self::
  • Fixed bug #616 : Squiz DisallowComparisonAssignmentSniff inconsistent errors with inline IF statements
  • Fixed bug #617 : Space after switch keyword in PSR-2 is not being enforced
  • Fixed bug #621 : PSR2 SwitchDeclaration sniff doesn't detect, or correctly fix, case body on same line as statement

2.3.2 - 2015-04-29

08 Nov 05:20
Compare
Choose a tag to compare
  • The error message for PSR2.ControlStructures.SwitchDeclaration.WrongOpenercase is now clearer (request #579)
  • Fixed bug #545 : Long list of CASE statements can cause tokenizer to reach a depth limit
  • Fixed bug #565 : Squiz.WhiteSpace.OperatorSpacing reports negative number in short array
    • Thanks to Vašek Purchart for the patch
    • Same fix also applied to Squiz.Formatting.OperatorBracket
  • Fixed bug #569 : Generic ScopeIndentSniff throws PHP notices in JS files
  • Fixed bug #570 : Phar class fatals in PHP less than 5.3

2.3.1 - 2015-04-23

08 Nov 05:19
Compare
Choose a tag to compare
  • PHPCS can now exit with 0 even if errors are found
    • Set the ignore_errors_on_exit config variable to 1 to set this behaviour
    • Use with the ignore_warnings_on_exit config variable to never return a non-zero exit code
  • Added Generic DisallowLongArraySyntaxSniff to enforce the use of the PHP short array syntax (request #483)
    • Thanks to Xaver Loppenstedt for helping with tests
  • Added Generic DisallowShortArraySyntaxSniff to ban the use of the PHP short array syntax (request #483)
    • Thanks to Xaver Loppenstedt for helping with tests
  • Generic ScopeIndentSniff no longer does exact checking for content inside parenthesis (request #528)
    • Only applies to custom coding standards that set the "exact" flag to TRUE
  • Squiz ConcatenationSpacingSniff now has a setting to ignore newline characters around operators (request #511)
    • Default remains FALSE, so newlines are not allowed
    • Override the "ignoreNewlines" setting in a ruleset.xml file to change
  • Squiz InlineCommentSniff no longer checks the last char of a comment if the first char is not a letter (request #505)
  • The Squiz standard has increased the max padding for statement alignment from 12 to 20
  • Fixed bug #479 : Yielded values are not recognised as returned values in Squiz FunctionComment sniff
  • Fixed bug #512 : Endless loop whilst parsing mixture of control structure styles
  • Fixed bug #515 : Spaces in JS block incorrectly flagged as indentation error
  • Fixed bug #523 : Generic ScopeIndent errors for IF in FINALLY
  • Fixed bug #527 : Closure inside IF statement is not tokenized correctly
  • Fixed bug #529 : Squiz.Strings.EchoedStrings gives false positive when echo'ing using an inline condition
  • Fixed bug #537 : Using --config-set is breaking phpcs.phar
  • Fixed bug #543 : SWITCH with closure in condition generates inline control structure error
  • Fixed bug #551 : Multiple catch blocks not checked in Squiz.ControlStructures.ControlSignature sniff
  • Fixed bug #554 : ScopeIndentSniff causes errors when encountering an unmatched parenthesis
  • Fixed bug #558 : PHPCBF adds brace for ELSE IF split over multiple lines
  • Fixed bug #564 : Generic MultipleStatementAlignment sniff reports incorrect errors for multiple assignments on a single line

2.3.0 - 2015-03-04

08 Nov 05:16
Compare
Choose a tag to compare
  • The existence of the main config file is now cached to reduce is_file() calls when it doesn't exist (request #486)
  • Abstract classes inside the Sniffs directory are now ignored even if they are named [Name]Sniff.php (request #476)
    • Thanks to David Vernet for the patch
  • PEAR and Squiz FileComment sniffs no longer have @ in their error codes
    • e.g., PEAR.Commenting.FileComment.Duplicate@categoryTag becomes PEAR.Commenting.FileComment.DuplicateCategoryTag
    • e.g., Squiz.Commenting.FileComment.Missing@categoryTag becomes Squiz.Commenting.FileComment.MissingCategoryTag
  • PEAR MultiLineConditionSniff now allows comment lines inside multi-line IF statement conditions
    • Thanks to Klaus Purer for the patch
  • Generic ForbiddenFunctionsSniff now supports setting null replacements in ruleset files (request #263)
  • Generic opening function brace sniffs now support checking of closures
    • Set the checkClosures property to TRUE (default is FALSE) in your ruleset.xml file to enable this
    • Can also set the checkFunctions property to FALSE (default is TRUE) in your ruleset.xml file to only check closures
    • Affects OpeningFunctionBraceBsdAllmanSniff and OpeningFunctionBraceKernighanRitchieSniff
  • Generic OpeningFunctionBraceKernighanRitchieSniff can now fix all the errors it finds
  • Generic OpeningFunctionBraceKernighanRitchieSniff now allows empty functions with braces next to each other
  • Generic OpeningFunctionBraceBsdAllmanSniff now allows empty functions with braces next to each other
  • Improved auto report width for the "full" report
  • Improved conflict detection during auto fixing
  • Generic ScopeIndentSniff is no longer confused by empty closures
  • Squiz ControlSignatureSniff now always ignores comments (fixes bug #490)
    • Include the Squiz.Commenting.PostStatementComment sniff in your ruleset.xml to ban these comments again
  • Squiz OperatorSpacingSniff no longer throws errors for code in the form ($foo || -1 === $bar)
  • Fixed errors tokenizing T_ELSEIF tokens on HHVM 3.5
  • Squiz ArrayDeclarationSniff is no longer tricked by comments after array values
  • PEAR IncludingFileSniff no longer produces invalid code when removing parenthesis from require/include statements
  • Fixed bug #415 : The @codingStandardsIgnoreStart has no effect during fixing
  • Fixed bug #432 : Properties of custom sniffs cannot be configured
  • Fixed bug #453 : PSR2 standard does not allow closing tag for mixed PHP/HTML files
  • Fixed bug #457 : FunctionCallSignature sniffs do not support here/nowdoc syntax and can cause syntax error when fixing
  • Fixed bug #466 : PropertyLabelSpacing JS fixer issue when there is no space after colon
  • Fixed bug #473 : Writing a report for an empty folder to existing file includes the existing contents
  • Fixed bug #485 : PHP notice in Squiz.Commenting.FunctionComment when checking malformed @throws comment
  • Fixed bug #491 : Generic InlineControlStructureSniff can correct with missing semicolon
    • Thanks to Jesse Donat for the patch
  • Fixed bug #492 : Use statements don't increase the scope indent
  • Fixed bug #493 : PSR1_Sniffs_Methods_CamelCapsMethodNameSniff false positives for some magic method detection
    • Thanks to Andreas Möller for the patch
  • Fixed bug #496 : Closures in PSR2 are not checked for a space after the function keyword
  • Fixed bug #497 : Generic InlineControlStructureSniff does not support alternative SWITCH syntax
  • Fixed bug #500 : Functions not supported as values in Squiz ArrayDeclaration sniff
  • Fixed bug #501 : ScopeClosingBrace and ScopeIndent conflict with closures used as array values
    • Generic ScopeIndentSniff may now report fewer errors for closures, but perform the same fixes
  • Fixed bug #502 : PSR1 SideEffectsSniff sees declare() statements as side effects

2.2.0 - 2015-01-21

08 Nov 05:14
Compare
Choose a tag to compare

PHPCS Config File

If PHP_CodeSniffer is not given a list of files to check and is not given a standard to use, it will now look for a phpcs.xml file in the current directory to figure out what it should do. The phpcs.xml file has the exact same format as a normal ruleset.xml file, so it can also be used as your primary standard. But it should also specify some files and/or directories to process using the new ruleset <file> tags.

Having one of these phpcs.xml files allows you to run the phpcs or phpcbf commands without specifying any command line options and still have them check or fix an entire codebase.

If you are using the phpcs.xml file as your primary standard, the files and directories you specify in there will be ignored if any files or directories are specified on the command line. So you can run phpcs like this:

$ phpcs

Or you can use phpcs.xml as a normal standard:

$ phpcs --standard=phpcs.xml /path/to/file

Auto-Sizing Reports

PHP_CodeSniffer has always allowed you to set a report width so that you can see more output in the screen-based reports. From version 2.2.0, you can tell PHP_CodeSniffer to use as much space as it can by using the --report-width=auto command line argument.

When using auto width, PHP_CodeSniffer will use the entire width of your terminal window to produce report output. If the report doesn't need all that width, PHP_CodeSniffer will only use as much as it needs to print the report without wrapping. Use the command phpcs --config-set report_width auto to use auto-sizing by default, or configure it in your ruleset.

PSR2 Tab Width

The PSR2 standard now includes a tab-width setting of 4 in the ruleset.xml file. PSR2 requires 4 spaces for indenting, so running that standard over tab indented code will now detect, and optionally fix, those tab indents correctly without you needing to specify the --tab-width=4 command line argument.

Other Changes

  • Added (hopefully) tastefully used colors to report and progress output for the phpcs command
    • Use the --colors command line argument to use colors in output
    • Use the command "phpcs --config-set colors true" to turn colors on by default
    • Use the --no-colors command line argument to turn colors off when the config value is set
  • Added support for using the full terminal width for report output
    • Use the --report-width=auto command line argument to auto-size the reports
    • Use the command "phpcs --config-set report_width auto" to use auto-sizing by default
  • Reports will now size to fit inside the report width setting instead of always using padding to fill the space
  • If no files or standards are specified, PHPCS will now look for a phpcs.xml file in the current directory
    • This file has the same format as a standard ruleset.xml file
    • The phpcs.xml file should specify (at least) files to process and a standard/sniffs to use
    • Useful for running the phpcs and phpcbf commands without any arguments at the top of a repository
  • Default file paths can now be specified in a ruleset.xml file using the "file" tag
    • File paths are only processed if no files were specified on the command line
  • Extensions specified on the CLI are now merged with those set in ruleset.xml files
    • Previously, the ruleset.xml file setting replaced the CLI setting completely
  • Squiz coding standard now requires lowercase PHP constants (true, false and null)
    • Removed Squiz.NamingConventions.ConstantCase sniff as the rule is now consistent across PHP and JS files
  • Squiz FunctionOpeningBraceSpaceSniff no longer does additional checks for JS functions
    • PHP and JS functions and closures are now treated the same way
  • Squiz MultiLineFunctionDeclarationSniff now supports JS files
  • Interactive mode no longer breaks if you also specify a report type on the command line
  • PEAR InlineCommentSniff now fixes the Perl-style comments that it finds (request #375)
  • PSR2 standard no longer fixes the placement of docblock open tags as comments are excluded from this standard
  • PSR2 standard now sets a default tab width of 4 spaces
  • Generic DocCommentSniff now only disallows lowercase letters at the start of a long/short comment (request #377)
    • All non-letter characters are now allowed, including markdown special characters and numbers
  • Generic DisallowMultipleStatementsSniff now allows multiple open/close tags on the same line (request #423)
  • Generic CharacterBeforePHPOpeningTagSniff now only checks the first PHP tag it finds (request #423)
  • Generic CharacterBeforePHPOpeningTagSniff now allows a shebang line at the start of the file (request #20481)
  • Generic InlineHTMLUnitTest now allows a shebang line at the start of the file (request #20481)
  • PEAR ObjectOperatorIndentSniff now only checks object operators at the start of a line
  • PEAR FileComment and ClassComment sniffs no longer have @ in their error codes
    • E.g., PEAR.Commenting.FileComment.Missing@categoryTag becomes PEAR.Commenting.FileComment.MissingCategoryTag
    • Thanks to Grzegorz Rygielski for the patch
  • Squiz ControlStructureSpacingSniff no longer enforces a blank line before CATCH statements
  • Squiz FunctionCommentSniff now fixes the return type in the @return tag (request #392)
  • Squiz BlockCommentSniff now only disallows lowercase letters at the start of the comment
  • Squiz InlineCommentSniff now only disallows lowercase letters at the start of the comment
  • Squiz OperatorSpacingSniff now has a setting to ignore newline characters around operators (request #348)
    • Default remains FALSE, so newlines are not allowed
    • Override the "ignoreNewlines" setting in a ruleset.xml file to change
  • PSR2 ControlStructureSpacingSniff now checks for, and fixes, newlines after the opening parenthesis
  • Added a markdown document generator (--generator=markdown to use)
    • Thanks to Stefano Kowalke for the contribution
  • Fixed bug #379 : Squiz.Arrays.ArrayDeclaration.NoCommaAfterLast incorrectly detects comments
  • Fixed bug #382 : JS tokenizer incorrect for inline conditionally created immediately invoked anon function
  • Fixed bug #383 : Squiz.Arrays.ArrayDeclaration.ValueNoNewline incorrectly detects nested arrays
  • Fixed bug #386 : Undefined offset in Squiz.FunctionComment sniff when param has no comment
  • Fixed bug #390 : Indentation of non-control structures isn't adjusted when containing structure is fixed
  • Fixed bug #400 : InlineControlStructureSniff fails to fix when statement has no semicolon
  • Fixed bug #401 : PHPCBF no-patch option shows an error when there are no fixable violations in a file
  • Fixed bug #405 : The "Squiz.WhiteSpace.FunctionSpacing" sniff removes class "}" during fixing
  • Fixed bug #407 : PEAR.ControlStructures.MultiLineCondition doesn't account for comments at the end of lines
  • Fixed bug #410 : The "Squiz.WhiteSpace.MemberVarSpacing" not respecting "var"
  • Fixed bug #411 : Generic.WhiteSpace.ScopeIndent.Incorrect - false positive with multiple arrays in argument list
  • Fixed bug #412 : PSR2 multi-line detection doesn't work for inline IF and string concats
  • Fixed bug #414 : Squiz.WhiteSpace.MemberVarSpacing - inconsistent checking of member vars with comment
  • Fixed bug #433 : Wrong detection of Squiz.Arrays.ArrayDeclaration.KeyNotAligned when key contains space
  • Fixed bug #434 : False positive for spacing around "=>" in inline array within foreach
  • Fixed bug #452 : Ruleset exclude-pattern for specific sniff code ignored when using CLI --ignore option
  • Fixed bug #20482 : Scope indent sniff can get into infinite loop when processing a parse error

2.1.0 - 2014-12-18

08 Nov 05:12
Compare
Choose a tag to compare
  • Time and memory output is now shown if progress information is also shown (request #335)
  • A tilde can now be used to reference a user's home directory in a path to a standard (request #353)
  • Added PHP_CodeSniffer_File::findStartOfStatement() to find the first non-whitespace token in a statement
    • Possible alternative for code using PHP_CodeSniffer_File::findPrevious() with the local flag set
  • Added PHP_CodeSniffer_File::findEndOfStatement() to find the last non-whitespace token in a statement
    • Possible alternative for code using PHP_CodeSniffer_File::findNext() with the local flag set
  • Generic opening function brace sniff now ensure the opening brace is the last content on the line
    • Affects OpeningFunctionBraceBsdAllmanSniff and OpeningFunctionBraceKernighanRitchieSniff
    • Also enforced in PEAR FunctionDeclarationSniff and Squiz MultiLineFunctionDeclarationSniff
  • Generic DisallowTabIndentSniff now replaces tabs everywhere it finds them, except in strings and here/now docs
  • Generic EmptyStatementSniff error codes now contain the type of empty statement detected (request #314)
    • All messages generated by this sniff are now errors (empty CATCH was previously a warning)
    • Message code Generic.CodeAnalysis.EmptyStatement.NotAllowed has been removed
    • Message code Generic.CodeAnalysis.EmptyStatement.NotAllowedWarning has been removed
    • New message codes have the format Generic.CodeAnalysis.EmptyStatement.Detected[TYPE]
    • Example code is Generic.CodeAnalysis.EmptyStatement.DetectedCATCH
    • You can now use a custom ruleset to change messages to warnings and to exclude them
  • PEAR and Squiz FunctionCommentSniffs no longer ban @return tags for constructors and destructors
    • Removed message PEAR.Commenting.FunctionComment.ReturnNotRequired
    • Removed message Squiz.Commenting.FunctionComment.ReturnNotRequired
    • Change initiated by request #324 and request #369
  • Squiz EmptyStatementSniff has been removed
    • Squiz standard now includes Generic EmptyStatementSniff and turns off the empty CATCH error
  • Squiz ControlSignatureSniff fixes now retain comments between the closing parenthesis and open brace
  • Squiz SuperfluousWhitespaceSniff now checks for extra blank lines inside closures
    • Thanks to Sertan Danis for the patch
  • Squiz ArrayDeclarationSniff now skips function calls while checking multi-line arrays
  • Fixed bug #337 : False positive with anonymous functions in Generic_Sniffs_WhiteSpace_ScopeIndentSniff
  • Fixed bug #339 : reformatting brace location can result in broken code
  • Fixed bug #342 : Nested ternary operators not tokenized correctly
  • Fixed bug #345 : Javascript regex not tokenized when inside array
  • Fixed bug #346 : PHP path can't be determined in some cases in "phpcs.bat" (on Windows XP)
  • Fixed bug #358 : False positives for Generic_Sniffs_WhiteSpace_ScopeIndentSniff
  • Fixed bug #361 : Sniff-specific exclude patterns don't work for Windows
  • Fixed bug #364 : Don't interpret "use function" as declaration
  • Fixed bug #366 : phpcbf with PSR2 errors on control structure alternative syntax
  • Fixed bug #367 : Nested Anonymous Functions Causing False Negative
  • Fixed bug #371 : Shorthand binary cast causes tokenizer errors
    • New token T_BINARY_CAST added for the b"string" cast format (the 'b' is the T_BINARY_CAST token)
  • Fixed bug #372 : phpcbf parse problem, wrong brace placement for inline IF
  • Fixed bug #373 : Double quote usage fix removing too many double quotes
  • Fixed bug #20196 : 1.5.2 breaks scope_closer position

2.0.0 - 2014-12-05

08 Nov 05:10
Compare
Choose a tag to compare
  • JS tokenizer now sets functions as T_CLOSUREs if the function is anonymous
  • JS tokenizer now sets all objects to T_OBJECT
    • Object end braces are set to a new token T_CLOSE_OBJECT
    • T_OBJECT tokens no longer act like scopes; i.e., they have no condition/opener/closer
    • T_PROPERTY tokens no longer act like scopes; i.e., they have no condition/opener/closer
    • T_OBJECT tokens have a bracket_closer instead, which can be used to find the ending
    • T_CLOSE_OBJECT tokens have a bracket_opener
  • Improved regular expression detection in the JS tokenizer
  • You can now get PHP_CodeSniffer to ignore a single line by putting @codingStandardsIgnoreLine in a comment
    • When the comment is found, the comment line and the following line will be ignored
    • Thanks to Andy Bulford for the contribution
  • PHPCBF now prints output when it is changing into directories
  • Improved conflict detection during auto fixing
  • The -vvv command line argument will now output the current file content for each loop during fixing
  • Generic ScopeIndentSniff now checks that open/close PHP tags are aligned to the correct column
  • PEAR FunctionCallSignatureSniff now checks indent of closing parenthesis even if it is not on a line by itself
  • PEAR FunctionCallSignatureSniff now supports JS files
  • PEAR MultiLineConditionSniff now supports JS files
  • Squiz DocCommentAlignmentSniff now supports JS files
  • Fixed a problem correcting the closing brace line in Squiz ArrayDeclarationSniff
  • Fixed a problem auto-fixing the Squiz.WhiteSpace.FunctionClosingBraceSpace.SpacingBeforeNestedClose error
  • Squiz EmbeddedPhpSniff no longer reports incorrect alignment of tags when they are not on new lines
  • Squiz EmbeddedPhpSniff now aligns open tags correctly when moving them onto a new line
  • Improved fixing of arrays with multiple values in Squiz ArrayDeclarationSniff
  • Improved detection of function comments in Squiz FunctionCommentSpacingSniff
  • Improved fixing of lines after cases statements in Squiz SwitchDeclarationSniff
  • Fixed bug #311 : Suppression of function prototype breaks checking of lines within function
  • Fixed bug #320 : Code sniffer indentation issue
  • Fixed bug #333 : Nested ternary operators causing problems