Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. EvalObjectFactorySniff.php

class EvalObjectFactorySniff

Hierarchy

  • class \PHP_CodeSniffer\Standards\MySource\Sniffs\PHP\EvalObjectFactorySniff implements \PHP_CodeSniffer\Sniffs\Sniff

Expanded class hierarchy of EvalObjectFactorySniff

File

vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/EvalObjectFactorySniff.php, line 18

Namespace

PHP_CodeSniffer\Standards\MySource\Sniffs\PHP
View source
class EvalObjectFactorySniff implements Sniff {
    
    /**
     * Returns an array of tokens this test wants to listen for.
     *
     * @return array<int|string>
     */
    public function register() {
        return [
            T_EVAL,
        ];
    }
    
    //end register()
    
    /**
     * Processes this sniff, 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.
     *
     * @return void
     */
    public function process(File $phpcsFile, $stackPtr) {
        $tokens = $phpcsFile->getTokens();
        
        /*
            We need to find all strings that will be in the eval
            to determine if the "new" keyword is being used.
        */
        $openBracket = $phpcsFile->findNext(T_OPEN_PARENTHESIS, $stackPtr + 1);
        $closeBracket = $tokens[$openBracket]['parenthesis_closer'];
        $strings = [];
        $vars = [];
        for ($i = $openBracket + 1; $i < $closeBracket; $i++) {
            if (isset(Tokens::$stringTokens[$tokens[$i]['code']]) === true) {
                $strings[$i] = $tokens[$i]['content'];
            }
            else {
                if ($tokens[$i]['code'] === T_VARIABLE) {
                    $vars[$i] = $tokens[$i]['content'];
                }
            }
        }
        
        /*
            We now have some variables that we need to expand into
            the strings that were assigned to them, if any.
        */
        foreach ($vars as $varPtr => $varName) {
            while (($prev = $phpcsFile->findPrevious(T_VARIABLE, $varPtr - 1)) !== false) {
                // Make sure this is an assignment of the variable. That means
                // it will be the first thing on the line.
                $prevContent = $phpcsFile->findPrevious(T_WHITESPACE, $prev - 1, null, true);
                if ($tokens[$prevContent]['line'] === $tokens[$prev]['line']) {
                    $varPtr = $prevContent;
                    continue;
                }
                if ($tokens[$prev]['content'] !== $varName) {
                    // This variable has a different name.
                    $varPtr = $prevContent;
                    continue;
                }
                // We found one.
                break;
            }
            
            //end while
            if ($prev !== false) {
                // Find all strings on the line.
                $lineEnd = $phpcsFile->findNext(T_SEMICOLON, $prev + 1);
                for ($i = $prev + 1; $i < $lineEnd; $i++) {
                    if (isset(Tokens::$stringTokens[$tokens[$i]['code']]) === true) {
                        $strings[$i] = $tokens[$i]['content'];
                    }
                }
            }
        }
        
        //end foreach
        foreach ($strings as $string) {
            // If the string has "new" in it, it is not allowed.
            // We don't bother checking if the word "new" is printed to screen
            // because that is unlikely to happen. We assume the use
            // of "new" is for object instantiation.
            if (strstr($string, ' new ') !== false) {
                $error = 'Do not use eval() to create objects dynamically; use reflection instead';
                $phpcsFile->addWarning($error, $stackPtr, 'Found');
            }
        }
    }
    
    //end process()

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title
EvalObjectFactorySniff::process public function Processes this sniff, when one of its tokens is encountered. Overrides Sniff::process
EvalObjectFactorySniff::register public function Returns an array of tokens this test wants to listen for. Overrides Sniff::register
RSS feed
Powered by Drupal