我有如下代码:
function processRequest() {
// get the verb
$method = strtolower($_SERVER['REQUEST_METHOD']);
switch ($method) {
case 'get':
handleGet();
break;
case 'post':
handlePost();
// $data = $_POST;
break;
case 'delete':
handleDelete();
break;
case 'options':
header('Allow: GET, POST, DELETE, OPTIONS');
break;
default:
header('HTTP/1.1 405 Method Not Allowed');
break;
}
}
PHP CodeSniffer 提示这些 case 语句的缩进。在带有 flymake 的 emacs 中,它看起来像这样:
消息是:
显然,CodeSniffer 希望 case 语句的缩进比它们实际的要少。
我如何告诉 CodeSniffer 允许我的 case 语句按照我想要的方式缩进。还是更好地强制我的case语句以这种方式缩进?
最佳答案
称为 PEAR.Whitespace.ScopeIndent
的嗅探在代码文件 phpcs\CodeSniffer\Standards\PEAR\Sniffs\Whitespace\ScopeIndentSniff.php
中定义,包括以下代码:
class PEAR_Sniffs_WhiteSpace_ScopeIndentSniff extends Generic_Sniffs_WhiteSpace_ScopeIndentSniff
{
/**
* Any scope openers that should not cause an indent.
*
* @var array(int)
*/
protected $nonIndentingScopes = array(T_SWITCH);
}//end class
看到
$nonIndentingScopes
了吗?这显然意味着 switch 语句范围内的任何内容都不会相对于范围开始 curl 进行缩进。我找不到在
PEAR.Whitespace.ScopeIndent
中调整此设置的方法,但是.... Sniff 扩展了更基本的 Generic.Whitespace.ScopeIndent
,它不包括 T_SWITCH
数组中的 $nonIndentingScopes
。所以我所做的以我想要的方式允许我的 case 语句是修改我的 ruleset.xml 文件,以排除该嗅探的 PEAR 版本,并包括该嗅探的通用版本。它看起来像这样:
<?xml version="1.0"?>
<ruleset name="Custom Standard">
<!-- http://pear.php.net/manual/en/package.php.php-codesniffer.annotated-ruleset.php -->
<description>My custom coding standard</description>
<rule ref="PEAR">
......
<exclude name="PEAR.WhiteSpace.ScopeIndent"/>
</rule>
....
<!-- not PEAR -->
<rule ref="Generic.WhiteSpace.ScopeIndent">
<properties>
<property name="indent" value="2"/>
</properties>
</rule>
</ruleset>
该文件需要存在于 PHP CodeSniffer 的标准目录下的子目录中。对我来说,文件位置是
\dev\phpcs\CodeSniffer\Standards\MyStandard\ruleset.xml
然后我像这样运行phpcs:
\php\php.exe \dev\phpcs\scripts\phpcs --standard=MyStandard --report=emacs -s file.php