Source for file ConstructorNameSniff.php
Documentation is available at ConstructorNameSniff.php
* Bans PHP 4 style constructors.
* Favor PHP 5 constructor syntax, which uses "function __construct()".
* Avoid PHP 4 constructor syntax, which uses "function ClassName()".
* @author Greg Sherwood <gsherwood@squiz.net>
* @author Leif Wickland <lwickland@rightnow.com>
* @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\Generic\Sniffs\NamingConventions;
use PHP_CodeSniffer\Sniffs\AbstractScopeSniff;
use PHP_CodeSniffer\Files\File;
class ConstructorNameSniff extends AbstractScopeSniff
* The name of the class we are currently checking.
private $currentClass = '';
* A list of functions in the current class.
private $functionList = array ();
* Constructs the test with the tokens it wishes to listen for.
public function __construct ()
parent ::__construct (array (T_CLASS , T_ANON_CLASS, T_INTERFACE ), array (T_FUNCTION ), true );
* Processes this test when one of its tokens is encountered.
* @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being scanned.
* @param int $stackPtr The position of the current token
* in the stack passed in $tokens.
* @param int $currScope A pointer to the start of the scope.
protected function processTokenWithinScope (File $phpcsFile, $stackPtr, $currScope)
$className = $phpcsFile->getDeclarationName ($currScope);
if ($className !== $this->currentClass) {
$this->loadFunctionNamesInScope ($phpcsFile, $currScope);
$this->currentClass = $className;
$methodName = $phpcsFile->getDeclarationName ($stackPtr);
if (in_array('__construct', $this->functionList) === false ) {
$error = 'PHP4 style constructors are not allowed; use "__construct()" instead';
$phpcsFile->addError ($error, $stackPtr, 'OldStyle');
} else if (strcasecmp($methodName, '__construct') !== 0 ) {
$tokens = $phpcsFile->getTokens ();
$parentClassName = $phpcsFile->findExtendedClassName ($currScope);
if ($parentClassName === false ) {
// Stop if the constructor doesn't have a body, like when it is abstract.
if (isset ($tokens[$stackPtr]['scope_closer']) === false ) {
$endFunctionIndex = $tokens[$stackPtr]['scope_closer'];
while (($doubleColonIndex = $phpcsFile->findNext (T_DOUBLE_COLON , $startIndex, $endFunctionIndex)) !== false ) {
if ($tokens[($doubleColonIndex + 1 )]['code'] === T_STRING
&& $tokens[($doubleColonIndex + 1 )]['content'] === $parentClassName
$error = 'PHP4 style calls to parent constructors are not allowed; use "parent::__construct()" instead';
$phpcsFile->addError ($error, ($doubleColonIndex + 1 ), 'OldStyleCall');
$startIndex = ($doubleColonIndex + 1 );
}//end processTokenWithinScope()
* Processes a token that is found within the scope that this test is
* @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found.
* @param int $stackPtr The position in the stack where this
protected function processTokenOutsideScope (File $phpcsFile, $stackPtr)
}//end processTokenOutsideScope()
* Extracts all the function names found in the given scope.
* @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being scanned.
* @param int $currScope A pointer to the start of the scope.
protected function loadFunctionNamesInScope (File $phpcsFile, $currScope)
$this->functionList = array ();
$tokens = $phpcsFile->getTokens ();
for ($i = ($tokens[$currScope]['scope_opener'] + 1 ); $i < $tokens[$currScope]['scope_closer']; $i++ ) {
if ($tokens[$i]['code'] !== T_FUNCTION ) {
$next = $phpcsFile->findNext (T_STRING , $i);
$this->functionList[] = trim($tokens[$next]['content']);
}//end loadFunctionNamesInScope()
Documentation generated on Mon, 11 Mar 2019 15:27:20 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.
|