我已经扩展了一类 PSR-2 嗅探集。现在检查执行了两次——即使我的 chid 类是空的。
为什么?以及如何正确地做到这一点?
编辑:
我现在有一个想法:可能是 Sniffer 自下而上处理规则集——从实际调用标准的规则集到最高(直接或间接包含)父标准。它显然完全执行了它们。(是这样吗?) 好的,但是怎么办?如何覆盖父规则集——替换它们的类但自定义类并停用单个规则?
代码:
[CodeSniffer]/Standards/ZF/ruleset.xml
<?xml version="1.0"?>
<ruleset name="ZF">
<description>...</description>
<!-- Include the whole PSR-2 standard -->
<rule ref="PSR2"/>
<!-- Argument lists MAY be split across multiple lines, where each subsequent line is indented once. When doing so, the first item in the list MUST be on the next line, and there MUST be only one argument per line. When the argument list is split across multiple lines, the closing parenthesis and opening brace MUST be placed together on their own line with one space between them. -->
<rule ref="ZF.Functions.MultiLineFunctionDeclaration"/>
... just comments yet
<!-- 5.7.2. Closure Definitions -->
<!-- TODO: Revome unwished check: Space after the function keyword is required. -->
<!-- 5.7.3. Function and Method Usage -->
<!-- TODO: Revome unwished check: one argument per line in a multi-line function call is required. -->
... just comments yet
</ruleset>
[CodeSniffer]/Standards/ZF/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php
<?php
if (class_exists('PEAR_Sniffs_Functions_FunctionDeclarationSniff', true) === false) {
$error = 'Class PEAR_Sniffs_Functions_FunctionDeclarationSniff not found';
throw new PHP_CodeSniffer_Exception($error);
}
class ZF_Sniffs_Functions_MultiLineFunctionDeclarationSniff extends PEAR_Sniffs_Functions_FunctionDeclarationSniff
{
public function processMultiLineDeclaration(PHP_CodeSniffer_File $phpcsFile, $stackPtr, $tokens)
{
}
public function processBracket(PHP_CodeSniffer_File $phpcsFile, $openBracket, $tokens, $type='function')
{
}
}
?>
称呼:
$ phpcs --standard=ZF -sw /path/to/Test.php
FILE: /path/to/Test.php
--------------------------------------------------------------------------------
FOUND 2 ERROR(S) AFFECTING 1 LINE(S)
--------------------------------------------------------------------------------
106 | ERROR | Expected 1 space after FUNCTION keyword; 0 found
| | (ZF.Functions.MultiLineFunctionDeclaration.SpaceAfterFunction)
106 | ERROR | Expected 1 space after FUNCTION keyword; 0 found
| | (Squiz.Functions.MultiLineFunctionDeclaration.SpaceAfterFunction)
--------------------------------------------------------------------------------
背景资料:
我想为 Zend Framework 2 项目编写一个PHP CodeSniffer规则集。大约一半的Zend Framework 2 编码标准已经在PSR-2 sniffs 文件夹中实现。
现在的目标不是实现整个 Zend 标准。我想从 PSR-2 开始,然后逐步添加/实现其他 Zend 规则。
问题是,PSR-2 嗅探器还包含一些违反 Zend 标准的检查。所以我必须覆盖这些嗅探。示例:(在闭包中的关键字/path/to/php/PHP/CodeSniffer/Standards/Squiz/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php
后需要一个空格)。function
PSR-2 基于 PSR-1 并使用此嗅探。所以我必须覆盖它们。