首先让我承认我昨天才第一次遇到 Code Sniffer。
我想为我的 ZF 1.x 项目设置自定义规则文件。然而,并非所有 Zend 片段都适用。
另一个问题,我不想重新发现轮子(我不能)所以需要使用现有的片段。
问题 1:这里的问题是,我如何知道是否存在我想要的规则的片段。作为最后一个选项,我总是可以去测试每个片段,但这显然不是最有效的方法。最好的方法是浏览现有片段的文档,但是单个片段的文档在哪里?
问题 2 的背景
我需要一些复杂的规则,比如 Doc 注释块(只是一个例子,我不会全部实现):
- 每个类和方法都必须有 Doc 注释块。
- 简短描述是强制性的
- 简短描述最多可以有 3 行。(每行 <= 120 个字符)
- 如果有函数参数,@param 对于每个参数都是必需的。
- 必须为未作为函数参数给出的 @param 引发错误。(这里的开发人员删除了参数,但忘记将它们从文档注释块中删除。这里的常见问题。)
- 长描述是可选的,但如果存在,短描述和长描述之间需要一个换行符。
- 描述和@tags 之间需要一个换行符。
- @tags 之间没有换行符,但@return(如果存在)必须在末尾。
- 在@return 之后只允许使用@throws。
- 如果@author 存在,它必须是公司名称,而不是个人名称。
- 不允许使用@version。
显然有很多自定义要求,所以我想我永远不会得到现有的代码段,需要编写自定义代码段,但是如何?我浏览了一些片段 php 文件,乍一看,它似乎有点复杂。只有两个选项,了解完整的 CS 代码,在这种情况下,我更喜欢使用 phabricator 进行手动审查,或者阅读文档,这似乎并不完整且没有帮助。
问题 2:那么下一个问题,其他人正在遵循哪种方法来理解 CS 代码并编写自己的代码片段,以备不时之需?
PS:在问这个问题之前,我已经浏览了 pear.php.net 上提供的所有 10 页 CS 文档,这 10 页并没有完全回答上述两个问题。
在第一条评论后编辑
我现有的规则集文件:
<?xml version="1.0"?>
<ruleset name="eetest">
<description>Below are the standard builds based on coding standards need to follow in
BAS development.</description>
<!-- Include some specific sniffs -->
<rule ref="Generic.CodeAnalysis.UnusedFunctionParameter"/>
<rule ref="Generic.Commenting.Todo"/>
<rule ref="Generic.ControlStructures.InlineControlStructure"/>
<rule ref="Generic.Formatting.DisallowMultipleStatements"/>
<rule ref="Generic.Formatting.SpaceAfterCast"/>
<rule ref="Generic.Functions.FunctionCallArgumentSpacing"/>
<rule ref="Generic.NamingConventions.ConstructorName"/>
<rule ref="Generic.NamingConventions.UpperCaseConstantName"/>
<rule ref="Generic.PHP.DeprecatedFunctions"/>
<rule ref="Generic.PHP.DisallowShortOpenTag"/>
<rule ref="Generic.PHP.LowerCaseKeyword"/>
<rule ref="Generic.Strings.UnnecessaryStringConcat"/>
<rule ref="Generic.WhiteSpace.DisallowTabIndent"/>
<rule ref="Generic.WhiteSpace.ScopeIndent"/>
<rule ref="PEAR.ControlStructures.MultiLineCondition"/>
<rule ref="PEAR.Files.IncludingFile"/>
<rule ref="PEAR.Formatting.MultiLineAssignment"/>
<rule ref="Zend.Debug.CodeAnalyzer"/>
<rule ref="Zend.NamingConventions.ValidVariableName"/>
<rule ref="Zend.Files.ClosingTag"/>
<!-- Method names MUST be declared in camelCase(). -->
<rule ref="Generic.NamingConventions.CamelCapsFunctionName">
<properties>
<property name="strict" value="true"/>
</properties>
</rule>
<!-- We don't want gsjlint throwing errors for things we already check -->
<rule ref="Generic.Debug.ClosureLinter">
<properties>
<property name="errorCodes" type="array" value="0210"/>
<property name="ignoreCodes" type="array" value="0001,0110,0240"/>
</properties>
</rule>
<rule ref="Generic.Debug.ClosureLinter.ExternalToolError">
<message>%2$s</message>
</rule>
<!-- Only one argument per line in multi-line function calls -->
<rule ref="PEAR.Functions.FunctionCallSignature">
<properties>
<property name="allowMultipleArguments" value="false"/>
</properties>
</rule>
</ruleset>
到目前为止,还没有自定义 PHP 代码,因为我正在努力理解 sippet 代码在做什么。