如何配置 PHP CodeSniffer 以允许数组具有任何缩进?

How to configure PHP CodeSniffer to allow arrays with any indentation?

我在 XML.

中定义了一个自定义规则集

我习惯于在每个 => 之后打一个 tab 这样,如果我的数组是多行的,事情就会很好地对齐。这成了一种习惯,我也将其用于单线阵列。因此,多行数组可能如下所示

$array = array(
    'something' =>  array(
        'short'     =>  1,
        'longer'    =>  1,
    ),
);

问题是 PHP CodeSniffer 抱怨 => 和值之间有超过 1 space(因为我总是点击 tab,所以会有大多数时候不止一个 space - 当然,根据到目前为止的行的长度,有时也可以是一个 space)

我尝试将 T_ARRAY 标记添加到 Generic.WhiteSpace.ScopeIndent 规则定义中,但没有帮助

<rule ref="Generic.WhiteSpace.ScopeIndent">
    <properties>
        <property name="indent" value="4"/>
        <property name="ignoreIndentationTokens" type="array" value="T_COMMENT,T_DOC_COMMENT_OPEN_TAG,T_ARRAY"/>
    </properties>
</rule>

有解决办法吗?

更新

好吧,我意识到 Generic.WhiteSpace.ScopeIndent 与此无关,因为 Squiz.WhiteSpace.OperatorSpacing 正在执行此规则。现在,根据 the docs 我无法配置此 属性 以排除 => 运算符。还有其他方法吗?

不幸的是,该嗅探器没有任何配置选项来忽略这种特定情况。除了给嗅探添加一个选项,你实际上只有两种方法来解决这个问题。两者都不是很好。

1。您可以在规则集中排除 Squiz.WhiteSpace.OperatorSpacing.SpacingAfter 错误代码。这仍然会允许嗅探在运算符之前和按位运算符周围产生间距错误,但是当标准运算符之后有多个空格时,您不会得到任何错误。

要排除错误代码,您可以将其添加到您的规则集中:

<exclude name="Squiz.WhiteSpace.OperatorSpacing.SpacingAfter"/>

2。您可以编写一个扩展 PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\OperatorSpacingSniff 并覆盖 isOperator() 方法的自定义嗅探。您覆盖的方法将检测到 T_DOUBLE_ARROW 标记和 return false,这将导致主嗅探代码停止检查双箭头。如果不是双箭头,可以把请求丢回父级class.

如果你这样做,你需要用嗅探维护你自己的标准,这意味着在某个地方放置一个目录,用一个嗅探子目录结构来保存你的嗅探。