【发布时间】:2013-05-01 21:19:24
【问题描述】:
在哪里可以找到有关PHP_CodeSniffer 可用规则的文档?在我看来,规则是存在的,但没有人知道它们的列表及其属性。我遇到了基本问题,我想自定义一个标准并强制花括号在语句除以一个空格后的同一行开始,并且看不到任何方法。这只是一个问题,但我还有很多其他问题。 谢谢。
【问题讨论】:
标签: php coding-style pear
在哪里可以找到有关PHP_CodeSniffer 可用规则的文档?在我看来,规则是存在的,但没有人知道它们的列表及其属性。我遇到了基本问题,我想自定义一个标准并强制花括号在语句除以一个空格后的同一行开始,并且看不到任何方法。这只是一个问题,但我还有很多其他问题。 谢谢。
【问题讨论】:
标签: php coding-style pear
查看源代码可能会令人恐惧,但最后,如果您想列出所有可能的规则(或 sniffs 如PHP_CodeSniffer 调用它们),您必须查看源代码.
我遇到了同样的问题,我使用了三种技术:
-s
phpcs 命令有一个选项可以输出未遵循的嗅探的标识符。我们来看一个例子:
$ phpcs -p -s --extensions=php /path/to/my/source/code
...E...E....W.....W..E.............W........................ 60 / 723 (8%)
.......................W.................................... 120 / 723 (17%)
.............................W..W....E..................E..E 180 / 723 (25%)
----------------------------------------------------------------------
60 | ERROR | [x] Line indented incorrectly; expected at least 2 spaces,
| | found 0 (Generic.WhiteSpace.ScopeIndent.Incorrect)
----------------------------------------------------------------------
61 | WARNING | Comment refers to a TODO task "Improve readability"
| | (Generic.Commenting.Todo.TaskFound)
----------------------------------------------------------------------
... output has been truncated
Time: 2 mins, 9.46 secs; Memory: 25.5Mb
在报告中,每个错误或警告都会输出嗅探。
ruleset.xml源代码中的文件项目中必须遵循或忽略哪些规则的配置通常在ruleset.xml 文件中定义。 PHP_CodeSniffer 源代码有一些例子。 PHP_CodeSniffer 定义了几个标准:Generic, PSR1, PSR2,...它们每个都有一个ruleset.xml 文件。您可以向他们学习如何创建自己的。
此技术需要您查看源代码,但您只需要阅读与您的项目中可能拥有的文件类似的文件。例如,您可以在 CodeSniffer/Standards/PSR2 文件夹下找到 PSR2 标准的 ruleset.xml 文件。
最后,如果您想要完整的嗅探列表,您需要从源代码中提取它们。让我们解码嗅探标识符是如何构建的。
很容易知道实现嗅探的 PHP 类。例如,我们以Generic.Commenting.Todo.TaskFound 为例。前三个标记的意思是:
Generic:它是标准,它定义了标准的文件夹CodeSniffer/Standards/Generic
Commenting:是标准下的嗅探组,也指向标准内的一个文件夹:CodeSniffer/Standards/Generic/Sniffs/Commenting
Todo:它是嗅探器,它在一个名为<sniff name>Sniff.php 的类中实现
所以,我们在 CodeSniffer/Standards/Generic/Sniffs/Commenting/TodoSniff.php 类中实现了 Generic.Commenting.Todo.TaskFound 嗅探。
我们可以反过来做。如果我们知道 PHP 类的路径,我们就能知道 PHP_CodeSniffer 将要报告的嗅探。例如,CodeSniffer/Standards/Squiz/Sniffs/NamingConventions/ValidFunctionNameSniff.php 中实现的类将生成标识符为 Squiz.NamingConventions.ValidFunctionName 的嗅探。
【讨论】:
试试这个 PHP 脚本。
将 $standardsDirectory 更改为正确的路径。
<?php
/**
* PHP_CodeSniffer "Standards" directory!
*/
$standardsDirectory = __DIR__. '/Standards';
/**
* Scan directory (recursive)
*/
function _scandir($path)
{
$list = [];
$elms = scandir($path);
if(!$elms)
return false;
foreach($elms as $elm)
{
if($elm == '.' || $elm == '..')
continue;
$fullpath = $path .'/'. $elm;
if(is_file($fullpath))
{
$list[] = $fullpath;
}
elseif(is_dir($fullpath))
{
$sublist = _scandir($fullpath);
$list = array_merge($list, $sublist);
}
}
return $list;
}
$list = [];
$files = _scandir($standardsDirectory);
foreach($files as $file)
{
if(preg_match('@Standards/(.*?)/Sniffs/(.*?)/(.*?)Sniff.php@i', $file, $matches))
{
$key = $matches[2] .'.'. $matches[3];
$desc = null;
$data = file_get_contents($file);
if($data)
{
$data = explode("\n", $data);
$desc = trim($data[2], " \t*");
}
$list[ $key ] = [
'shortName' => $matches[2] .'.'. $matches[3],
'fullName' => $matches[1] .'.'. $matches[2] .'.'. $matches[3],
'path' => $matches[0],
'desc' => $desc,
];
}
}
ksort($list);
?>
<html>
<body style="font-family: Consolas, 'Lucida Console';">
<table>
<?php foreach($list as $e): ?>
<tr align="left">
<th><?=$e['shortName']?></th>
<td><?=$e['fullName']?></td>
<td><?=$e['desc']?></td>
</tr>
<?php endforeach; ?>
</table>
</body>
</html>
【讨论】:
除了source code,没有关于规则的文档。查看不同的标准以及它们如何使用它们。
【讨论】:
老问题,但我发现这很有用: http://pear.php.net/package/PHP_CodeSniffer/docs/latest/
它列出了 Pear 包中的所有文件,所有以“Sniff”结尾的文件都是可用的检查。
【讨论】: