Skip to content

Releases: PHPCSStandards/PHP_CodeSniffer

2.6.0 - 2016-04-04

08 Nov 05:42

Choose a tag to compare

  • Paths used when setting CLI arguments inside ruleset.xml files are now relative to the ruleset location (request #847)
    • This change only applies to paths within ARG tags, used to set CLI arguments
    • Previously, the paths were relative to the directory PHPCS was being run from
    • Absolute paths are still allowed and work the same way they always have
    • This change allows ruleset.xml files to be more portable
  • Content passed via STDIN will now be processed even if files are specified on the command line or in a ruleset
  • When passing content via STDIN, you can now specify the file path to use on the command line (request #934)
    • This allows sniffs that check file paths to work correctly
    • This is the same functionality provided by the phpcs_input_file line, except it is available on the command line
  • Files processed with custom tokenizers will no longer be skipped if they appear minified (request #877)
    • If the custom tokenizer wants minified files skipped, it can set a $skipMinified member var to TRUE
    • See the included JS and CSS tokenizers for an example
  • Config vars set in ruleset.xml files are now processed earlier, allowing them to be used during sniff registration
    • Among other things, this allows the installed_paths config var to be set in ruleset.xml files
    • Thanks to Pieter Frenssen for the patch
  • Improved detection of regular expressions in the JS tokenizer
  • Generic PHP Syntax sniff now uses PHP_BINARY (if available) to determine the path to PHP if no other path is available
    • You can still manually set php_path to use a specific binary for testing
    • Thanks to Andrew Berry for the patch
  • The PHP-supplied T_POW_EQUAL token has been replicated for PHP versions before 5.6
  • Added support for PHP7 use group declarations (request #878)
    • New tokens T_OPEN_USE_GROUP and T_CLOSE_USE_GROUP are assigned to the open and close curly braces
  • Generic ScopeIndent sniff now reports errors for every line that needs the indent changed (request #903)
    • Previously, it ignored lines that were indented correctly in the context of their block
    • This change produces more technically accurate error messages, but is much more verbose
  • The PSR2 and Squiz standards now allow multi-line default values in function declarations (request #542)
    • Previously, these would automatically make the function a multi-line declaration
  • Squiz InlineCommentSniff now allows docblocks on require(_once) and include(_once) statements
    • Thanks to Gary Jones for the patch
  • Squiz and PEAR Class and File sniffs no longer assume the first comment in a file is always a file comment
    • phpDocumentor assigns the comment to the file only if it is not followed by a structural element
    • These sniffs now follow this same rule
  • Squiz ClassCommentSniff no longer checks for blank lines before class comments
    • Removes the error Squiz.Commenting.ClassComment.SpaceBefore
  • Renamed Squiz.CSS.Opacity.SpacingAfterPoint to Squiz.CSS.Opacity.DecimalPrecision
    • Please update your ruleset if you are referencing this error code directly
  • Fixed PHP tokenizer problem that caused an infinite loop when checking a comment with specific content
  • Generic Disallow Space and Tab indent sniffs now detect and fix indents inside embedded HTML chunks (request #882)
  • Squiz CSS IndentationSniff no longer assumes the class opening brace is at the end of a line
  • Squiz FunctionCommentThrowTagSniff now ignores non-docblock comments
  • Squiz ComparisonOperatorUsageSniff now allows conditions like while(true)
  • PEAR FunctionCallSignatureSniff (and the Squiz and PSR2 sniffs that use it) now correctly check the first argument
    • Further fix for bug #698
  • Fixed bug #791 : codingStandardsChangeSetting settings not working with namespaces
  • Fixed bug #872 : Incorrect detection of blank lines between CSS class names
  • Fixed bug #879 : Generic InlineControlStructureSniff can create parse error when case/if/elseif/else have mixed brace and braceless definitions
  • Fixed bug #883 : PSR2 is not checking for blank lines at the start and end of control structures
  • Fixed bug #884 : Incorrect indentation notice for anonymous classes
  • Fixed bug #887 : Using curly braces for a shared CASE/DEFAULT statement can generate an error in PSR2 SwitchDeclaration
  • Fixed bug #889 : Closure inside catch/else/elseif causes indentation error
  • Fixed bug #890 : Function call inside returned short array value can cause indentation error inside CASE statements
  • Fixed bug #897 : Generic.Functions.CallTimePassByReference.NotAllowed false positive when short array syntax
  • Fixed bug #900 : Squiz.Functions.FunctionDeclarationArgumentSpacing bug when no space between type hint and argument
  • Fixed bug #902 : T_OR_EQUAL and T_POW_EQUAL are not seen as assignment tokens
  • Fixed bug #910 : Unrecognized "extends" and indentation on anonymous classes
  • Fixed bug #915 : JS Tokenizer generates errors when processing some decimals
  • Fixed bug #928 : Endless loop when sniffing a PHP file with a git merge conflict inside a function
  • Fixed bug #937 : Shebang can cause PSR1 SideEffects warning
    • Thanks to Clay Loveless for the patch
  • Fixed bug #938 : CallTimePassByReferenceSniff ignores functions with return value

2.5.1 - 2016-01-20

08 Nov 05:41

Choose a tag to compare

  • The PHP-supplied T_SPACESHIP token has been replicated for PHP versions before 7.0
  • T_SPACESHIP is now correctly identified as an operator
    • Thanks to Alexander Obuhovich for the patch
  • Generic LowerCaseKeyword now ensures array type hints are lowercase as well
    • Thanks to Mathieu Rochette for the patch
  • Squiz ComparisonOperatorUsageSniff no longer hangs on JS FOR loops that don't use semicolons
  • PHP_CodesSniffer now includes the composer autoload.php file, if there is one
    • Thanks to Klaus Purer for the patch
  • Added error Squiz.Commenting.FunctionComment.ScalarTypeHintMissing for PHP7 only (request #858)
    • These errors were previously reported as Squiz.Commenting.FunctionComment.TypeHintMissing on PHP7
    • Disable this error message in a ruleset.xml file if your code needs to run on both PHP5 and PHP7
  • The PHP 5.6 __debugInfo magic method no longer produces naming convention errors
    • Thanks to Michael Nowack for the patch
  • PEAR and Squiz FunctionComment sniffs now support variadic functions (request #841)
  • Fixed bug #622 : Wrong detection of Squiz.CSS.DuplicateStyleDefinition with media queries
  • Fixed bug #752 : The missing exception error is reported in first found DocBlock
  • Fixed bug #794 : PSR2 MultiLineFunctionDeclaration forbids comments after opening parenthesis of a multiline call
  • Fixed bug #820 : PEAR/PSR2 FunctionCallSignature sniffs suggest wrong indent when there are multiple arguments on a line
  • Fixed bug #822 : Ruleset hard-coded file paths are not used if not running from the same directory as the ruleset
  • Fixed bug #825 : FunctionCallArgumentSpacing sniff complains about more than one space before comment in multi-line function call
  • Fixed bug #828 : Null classname is tokenized as T_NULL instead of T_STRING
  • Fixed bug #829 : Short array argument not fixed correctly when multiple function arguments are on the same line
  • Fixed bug #831 : PHPCS freezes in an infinite loop under Windows if no standard is passed
  • Fixed bug #832 : Tokenizer does not support context sensitive parsing
    • Thanks to Jaroslav Hanslík for the patch
  • Fixed bug #835 : PEAR.Functions.FunctionCallSignature broken when closure uses return types
  • Fixed bug #838 : CSS indentation fixer changes color codes
    • Thanks to Klaus Purer for the patch
  • Fixed bug #839 : "__()" method is marked as not camel caps
    • Thanks to Tim Bezhashvyly for the patch
  • Fixed bug #852 : Generic.Commenting.DocComment not finding errors when long description is omitted
  • Fixed bug #854 : Return typehints in interfaces are not reported as T_RETURN_TYPE
    • Thanks to Jaroslav Hanslík for the patch
  • Fixed bug #855 : Capital letter detection for multibyte strings doesn't work correctly
  • Fixed bug #857 : PSR2.ControlStructure.SwitchDeclaration shouldn't check indent of curly brace closers
  • Fixed bug #859 : Switch statement indention issue when returning function call with closure
  • Fixed bug #861 : Single-line arrays and function calls can generate incorrect indentation errors
  • Fixed bug #867 : Squiz.Strings.DoubleQuoteUsage broken for some escape codes
    • Thanks to Jack Blower for the help with the fix
  • Fixed bug #21005 : Incorrect indent detection when multiple properties are initialized to arrays
  • Fixed bug #21010 : Incorrect missing colon detection in CSS when first style is not on new line
  • Fixed bug #21011 : Incorrect error message text when newline found after opening brace

2.5.0 - 2015-12-11

08 Nov 05:38

Choose a tag to compare

  • PHPCS will now look for a phpcs.xml file in parent directories as well as the current directory (request #626)
  • PHPCS will now use a phpcs.xml file even if files are specified on the command line
    • This file is still only used if no standard is specified on the command line
  • Added support for a phpcs.xml.dist file (request #583)
    • If both a phpcs.xml and phpcs.xml.dist file are present, the phpcs.xml file will be used
  • Added support for setting PHP ini values in ruleset.xml files (request #560)
    • Setting the value of the new ini tags to name="memory_limit" value="32M" is the same as -d memory_limit=32M
  • Added support for one or more bootstrap files to be run before processing begins
    • Use the --bootstrap=file,file,file command line argument to include bootstrap files
    • Useful if you want to override some of the high-level settings of PHPCS or PHPCBF
    • Thanks to John Maguire for the patch
  • Added additional verbose output for CSS tokenizing
  • Squiz ComparisonOperatorUsageSniff now checks FOR, WHILE and DO-WHILE statements
    • Thanks to Arnout Boks for the patch
  • Fixed bug #660 : Syntax checks can fail on Windows with PHP5.6
  • Fixed bug #784 : $this->trait is seen as a T_TRAIT token
  • Fixed bug #786 : Switch indent issue with short array notation
  • Fixed bug #787 : SpacingAfterDefaultBreak confused by multi-line statements
  • Fixed bug #797 : Parsing CSS url() value breaks further parsing
  • Fixed bug #805 : Squiz.Commenting.FunctionComment.InvalidTypeHint on Scalar types on PHP7
  • Fixed bug #807 : Cannot fix line endings when open PHP tag is not on the first line
  • Fixed bug #808 : JS tokeniser incorrectly setting some function and class names to control structure tokens
  • Fixed bug #809 : PHPCBF can break a require_once statement with a space before the open parenthesis
  • Fixed bug #813 : PEAR FunctionCallSignature checks wrong indent when first token on line is part of a multi-line string

2.4.0 - 2015-11-23

08 Nov 05:36

Choose a tag to compare

  • Added support for PHP 7 anonymous classes
    • Anonymous classes are now tokenized as T_ANON_CLASS and ignored by normal class sniffs
  • Added support for PHP 7 function return type declarations
    • Return types are now tokenized as T_RETURN_TYPE
  • Fixed tokenizing of the XOR operator, which was incorrectly identified as a power operator (bug #765)
    • The T_POWER token has been removed and replaced by the T_BITWISE_XOR token
    • The PHP-supplied T_POW token has been replicated for PHP versions before 5.6
  • Traits are now tokenized in PHP versions before 5.4 to make testing easier
  • Improved regular expression detection in JS files
  • PEAR FunctionCallSignatureSniff now properly detects indents in more mixed HTML/PHP code blocks
  • Full report now properly indents lines when newlines are found inside error messages
  • Generating documentation without specifying a standard now uses the default standard instead
    • Thanks to Ken Guest for the patch
  • Generic InlineControlStructureSniff now supports braceless do/while loops in JS
    • Thanks to Pieter Frenssen for the patch
  • Added more guard code for function declarations with syntax errors
    • Thanks to Yun Young-jin for the patch
  • Added more guard code for foreach declarations with syntax errors
    • Thanks to Johan de Ruijter for the patch
  • Added more guard code for class declarations with syntax errors
  • Squiz ArrayDeclarationSniff now has guard code for arrays with syntax errors
  • Generic InlineControlStructureSniff now correctly fixes ELSEIF statements
  • Fixed bug #601 : Expected type hint int[]; found array in Squiz FunctionCommentSniff
    • Thanks to Scato Eggen for the patch
  • Fixed bug #625 : Consider working around T_HASHBANG in HHVM 3.5.x and 3.6.x
    • Thanks to Kunal Mehta for the patch
  • Fixed bug #692 : Comment tokenizer can break when using mbstring function overloading
  • Fixed bug #694 : Long sniff codes can cause PHP warnings in source report when showing error codes
  • Fixed bug #698 : PSR2.Methods.FunctionCallSignature.Indent forces exact indent of ternary operator parameters
  • Fixed bug #704 : ScopeIndent can fail when an opening parenthesis is on a line by itself
  • Fixed bug #707 : Squiz MethodScopeSniff doesn't handle nested functions
  • Fixed bug #709 : Squiz.Sniffs.Whitespace.ScopeClosingBraceSniff marking indented endif in mixed inline HTML blocks
  • Fixed bug #711 : Sniffing from STDIN shows Generic.Files.LowercasedFilename.NotFound error
  • Fixed bug #714 : Fixes suppression of errors using docblocks
    • Thanks to Andrzej Karmazyn for the patch
  • Fixed bug #716 : JSON report is invalid when messages contain newlines or tabs
    • Thanks to Pieter Frenssen for the patch
  • Fixed bug #723 : ScopeIndent can fail when multiple array closers are on the same line
  • Fixed bug #730 : ScopeIndent can fail when a short array opening square bracket is on a line by itself
  • Fixed bug #732 : PHP Notice if @package name is made up of all invalid characters
    • Adds new error code PEAR.Commenting.FileComment.InvalidPackageValue
  • Fixed bug #748 : Auto fix for Squiz.Commenting.BlockComment.WrongEnd is incorrect
    • Thanks to J.D. Grimes for the patch
  • Fixed bug #753 : PSR2 standard shouldn't require space after USE block when next code is a closing tag
  • Fixed bug #768 : PEAR FunctionCallSignature sniff forbids comments after opening parenthesis of a multiline call
  • Fixed bug #769 : Incorrect detection of variable reference operator when used with short array syntax
    • Thanks to Klaus Purer for the patch
  • Fixed bug #772 : Syntax error when using PHPCBF on alternative style foreach loops
  • Fixed bug #773 : Syntax error when stripping trailing PHP close tag and previous statement has no semicolon
  • Fixed bug #778 : PHPCBF creates invalid PHP for inline FOREACH containing multiple control structures
  • Fixed bug #781 : Incorrect checking for PHP7 return types on multi-line function declartions
  • Fixed bug #782 : Conditional function declarations cause fixing conflicts in Squiz standard
    • Squiz.ControlStructures.ControlSignature no longer enforces a single newline after open brace
    • Squiz.WhiteSpace.ControlStructureSpacing can be used to checl spacing at the start/end of control structures

2.3.4 - 2015-09-09

08 Nov 05:34

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

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

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

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

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

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