12

PSR-2 スニフ セットのクラスを拡張しました。これで、chid クラスが空であっても、チェックが 2 回実行されます。

なんで?そして、それを正しく行う方法は?


編集:

その理由がわかりました。おそらく、Sniffer は、実際に呼び出された標準のルールセットから、最上位の (直接または間接的に含まれる) 親標準まで、ルールセットをボトムアップで処理します。それらを明らかに完全に実行します。(そうなの?) いいけど、どうする?親ルールセットをオーバーライドする方法 -- それらのクラスを置き換えてカスタムのものを置き換え、単一のルールを無効にしますか?


コード:

[CodeSniffer]/規格/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のキーワードの後に​​スペースが必要です)。functionPSR-2 は PSR-1 に基づいており、このスニフを使用します。だから私はそれらを上書きする必要があります。

4

1 に答える 1

22

単一のスニフの除外excludeは、次のような方向で簡単に実行できます。

<?xml version="1.0"?>
<ruleset name="ZF">
    <description>...</description>
    <!-- Include the whole PSR-2 standard -->
    <rule ref="PSR2">
        <!-- to disable a single error -->
        <exclude name="Squiz.Functions.MultiLineFunctionDeclaration.SpaceAfterFunction"/>
        <!-- or to disable the whole sniff -->
        <exclude name="Squiz.Functions.MultiLineFunctionDeclaration"/>
    </rule>
    ...
</ruleset>

それ以外の

<?xml version="1.0"?>
<ruleset name="ZF">
    <description>...</description>
    <!-- Include the whole PSR-2 standard -->
    <rule ref="PSR2"/>
    ...
</ruleset>

オーバーライド= スニフの除外 + 代替スニフの作成。

PHP CodeSniffer マニュアルの注釈付きサンプルruleset.xmlも参照してください。

于 2013-11-09T09:56:36.913 に答える