我希望扫描文件以查找字符串 Firebug,但这还不够。我还希望在 QFirebug::log 和 QFirebug::error 静态方法之间有所不同。
如何在类名后提取方法名?
public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
{
$tokens = $phpcsFile->getTokens();
echo $tokens[$stackPtr]['content'];
if ($tokens[$stackPtr]['content'] === 'Firebug') {
$error = 'found ' . $tokens[$stackPtr]['content'];
$data = array(trim($tokens[$stackPtr]['content']));
$phpcsFile->addError($error, $stackPtr, 'Found', $data);
}
}//end process()
Run Code Online (Sandbox Code Playgroud)
如果您使用-vv命令行参数运行 phpcs ,您可以看到 PHP 文件被分解成的令牌列表。对于像Firebug::error();您这样的行:
Process token 1 on line 2 [lvl:0;]: T_STRING => Firebug
Process token 2 on line 2 [lvl:0;]: T_DOUBLE_COLON => ::
Process token 3 on line 2 [lvl:0;]: T_STRING => error
Process token 4 on line 2 [lvl:0;]: T_OPEN_PARENTHESIS => (
Process token 5 on line 2 [lvl:0;]: T_CLOSE_PARENTHESIS => )
Process token 6 on line 2 [lvl:0;]: T_SEMICOLON => ;
Run Code Online (Sandbox Code Playgroud)
你没有展示你的整个嗅探,但我假设你正在寻找 T_STRING 令牌。在这种情况下,一旦您确定 $stackPtr 指向“Firebug”字符串,只需确认它是一个静态调用,然后获取下一个字符串标记:
if ($tokens[$stackPtr]['content'] === 'Firebug'
&& $tokens[($stackPtr + 1)]['code'] === T_DOUBLE_COLON
) {
// This is a static call to a Firebug class method.
$methodName = $tokens[($stackPtr + 2)]['content'];
/* your error code here */
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您认为人们会在双冒号之间放置空格,Firebug :: error()那么您可以执行以下操作:
if ($tokens[$stackPtr]['content'] === 'Firebug') {
// Find the next non-whitespace token.
$colon = $phpcsFile->findNext(PHP_CodeSniffer_Tokens::$emptyTokens, ($stackPtr + 1), null, true);
if ($tokens[$colon]['code'] === T_DOUBLE_COLON) {
// This is a static call to a Firebug class method.
$methodName = $phpcsFile->findNext(T_STRING, ($colon + 1));
/* your error code here */
}
}
Run Code Online (Sandbox Code Playgroud)
如果您想更进一步,您还可以查找 T_OPEN_PARENTHESIS 和 T_CLOSE_PARENTHESIS 令牌,以确认它是一个函数调用,但这取决于您使用的类。
希望有帮助。
| 归档时间: |
|
| 查看次数: |
276 次 |
| 最近记录: |