Source for file ForEachLoopDeclarationSniff.php
Documentation is available at ForEachLoopDeclarationSniff.php
* Verifies that there is a space between each condition of foreach loops.
* @author Greg Sherwood <gsherwood@squiz.net>
* @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600)
* @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures;
use PHP_CodeSniffer\Sniffs\Sniff;
use PHP_CodeSniffer\Files\File;
class ForEachLoopDeclarationSniff implements Sniff
* How many spaces should follow the opening bracket.
public $requiredSpacesAfterOpen = 0;
* How many spaces should precede the closing bracket.
public $requiredSpacesBeforeClose = 0;
* Returns an array of tokens this test wants to listen for.
public function register ()
* Processes this test, when one of its tokens is encountered.
* @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.
* @param int $stackPtr The position of the current token in the
* stack passed in $tokens.
public function process (File $phpcsFile, $stackPtr)
$this->requiredSpacesAfterOpen = (int) $this->requiredSpacesAfterOpen;
$this->requiredSpacesBeforeClose = (int) $this->requiredSpacesBeforeClose;
$tokens = $phpcsFile->getTokens ();
if ($openingBracket === false ) {
$error = 'Possible parse error: FOREACH has no opening parenthesis';
$phpcsFile->addWarning ($error, $stackPtr, 'MissingOpenParenthesis');
if (isset ($tokens[$openingBracket]['parenthesis_closer']) === false ) {
$error = 'Possible parse error: FOREACH has no closing parenthesis';
$phpcsFile->addWarning ($error, $stackPtr, 'MissingCloseParenthesis');
$closingBracket = $tokens[$openingBracket]['parenthesis_closer'];
if ($this->requiredSpacesAfterOpen === 0 && $tokens[($openingBracket + 1 )]['code'] === T_WHITESPACE ) {
$error = 'Space found after opening bracket of FOREACH loop';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'SpaceAfterOpen');
$phpcsFile->fixer ->replaceToken (($openingBracket + 1 ), '');
} else if ($this->requiredSpacesAfterOpen > 0 ) {
if ($tokens[($openingBracket + 1 )]['code'] === T_WHITESPACE ) {
$spaceAfterOpen = strlen($tokens[($openingBracket + 1 )]['content']);
if ($spaceAfterOpen !== $this->requiredSpacesAfterOpen) {
$error = 'Expected %s spaces after opening bracket; %s found';
$this->requiredSpacesAfterOpen,
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'SpacingAfterOpen', $data);
$padding = str_repeat(' ', $this->requiredSpacesAfterOpen);
if ($spaceAfterOpen === 0 ) {
$phpcsFile->fixer ->addContent ($openingBracket, $padding);
$phpcsFile->fixer ->replaceToken (($openingBracket + 1 ), $padding);
if ($this->requiredSpacesBeforeClose === 0 && $tokens[($closingBracket - 1 )]['code'] === T_WHITESPACE ) {
$error = 'Space found before closing bracket of FOREACH loop';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'SpaceBeforeClose');
$phpcsFile->fixer ->replaceToken (($closingBracket - 1 ), '');
} else if ($this->requiredSpacesBeforeClose > 0 ) {
if ($tokens[($closingBracket - 1 )]['code'] === T_WHITESPACE ) {
$spaceBeforeClose = strlen($tokens[($closingBracket - 1 )]['content']);
if ($spaceBeforeClose !== $this->requiredSpacesBeforeClose) {
$error = 'Expected %s spaces before closing bracket; %s found';
$this->requiredSpacesBeforeClose,
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'SpaceBeforeClose', $data);
$padding = str_repeat(' ', $this->requiredSpacesBeforeClose);
if ($spaceBeforeClose === 0 ) {
$phpcsFile->fixer ->addContentBefore ($closingBracket, $padding);
$phpcsFile->fixer ->replaceToken (($closingBracket - 1 ), $padding);
$asToken = $phpcsFile->findNext (T_AS , $openingBracket);
if ($asToken === false ) {
$error = 'Possible parse error: FOREACH has no AS statement';
$phpcsFile->addWarning ($error, $stackPtr, 'MissingAs');
$content = $tokens[$asToken]['content'];
$error = 'AS keyword must be lowercase; expected "%s" but found "%s"';
$fix = $phpcsFile->addFixableError ($error, $asToken, 'AsNotLower', $data);
$phpcsFile->fixer ->replaceToken ($asToken, $expected);
$doubleArrow = $phpcsFile->findNext (T_DOUBLE_ARROW , $asToken, $closingBracket);
if ($doubleArrow !== false ) {
if ($tokens[($doubleArrow - 1 )]['code'] !== T_WHITESPACE ) {
$error = 'Expected 1 space before "=>"; 0 found';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'NoSpaceBeforeArrow');
$phpcsFile->fixer ->addContentBefore ($doubleArrow, ' ');
if (strlen($tokens[($doubleArrow - 1 )]['content']) !== 1 ) {
$spaces = strlen($tokens[($doubleArrow - 1 )]['content']);
$error = 'Expected 1 space before "=>"; %s found';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'SpacingBeforeArrow', $data);
$phpcsFile->fixer ->replaceToken (($doubleArrow - 1 ), ' ');
if ($tokens[($doubleArrow + 1 )]['code'] !== T_WHITESPACE ) {
$error = 'Expected 1 space after "=>"; 0 found';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'NoSpaceAfterArrow');
$phpcsFile->fixer ->addContent ($doubleArrow, ' ');
if (strlen($tokens[($doubleArrow + 1 )]['content']) !== 1 ) {
$spaces = strlen($tokens[($doubleArrow + 1 )]['content']);
$error = 'Expected 1 space after "=>"; %s found';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'SpacingAfterArrow', $data);
$phpcsFile->fixer ->replaceToken (($doubleArrow + 1 ), ' ');
if ($tokens[($asToken - 1 )]['code'] !== T_WHITESPACE ) {
$error = 'Expected 1 space before "as"; 0 found';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'NoSpaceBeforeAs');
$phpcsFile->fixer ->addContentBefore ($asToken, ' ');
if (strlen($tokens[($asToken - 1 )]['content']) !== 1 ) {
$spaces = strlen($tokens[($asToken - 1 )]['content']);
$error = 'Expected 1 space before "as"; %s found';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'SpacingBeforeAs', $data);
$phpcsFile->fixer ->replaceToken (($asToken - 1 ), ' ');
if ($tokens[($asToken + 1 )]['code'] !== T_WHITESPACE ) {
$error = 'Expected 1 space after "as"; 0 found';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'NoSpaceAfterAs');
$phpcsFile->fixer ->addContent ($asToken, ' ');
if (strlen($tokens[($asToken + 1 )]['content']) !== 1 ) {
$spaces = strlen($tokens[($asToken + 1 )]['content']);
$error = 'Expected 1 space after "as"; %s found';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'SpacingAfterAs', $data);
$phpcsFile->fixer ->replaceToken (($asToken + 1 ), ' ');
Documentation generated on Mon, 11 Mar 2019 15:27:29 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.
|