22

在哪里可以找到有关可用的PHP_CodeSniffer规则的文档?在我看来,规则是存在的,但没有人知道它们的列表及其属性。我遇到了基本问题,我想自定义一个标准并强制花括号在语句除以一个空格后的同一行开始,并且看不到任何方法。这只是一个问题,但我还有很多其他问题。谢谢你。

4

4 回答 4

20

查看源代码可能会令人恐惧,但最后,如果您想列出所有可能的规则(或PHP_CodeSniffer调用它们的嗅探),您必须查看源代码。

我遇到了同样的问题,我使用了三种技术:

1. 选项-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

在报告中,每个错误或警告都会输出嗅探。

2.ruleset.xml源代码中的文件

项目中必须遵循或忽略哪些规则的配置通常在ruleset.xml文件中定义。PHP_CodeSniffer 源代码有一些例子。PHP_CodeSniffer 定义了几个标准:Generic, PSR1, PSR2,... 每一个都有一个ruleset.xml文件。您可以向他们学习如何创建自己的。

这种技术需要您查看源代码,但您只需要阅读与您的项目中可能拥有的文件类似的文件。例如,您可以在该文件夹ruleset.xml下找到 PSR2 标准的CodeSniffer/Standards/PSR2文件。

3.最终,源代码

最后,如果你想要完整的嗅探列表,你需要从源代码中提取它们。让我们解码如何构建嗅探标识符。

很容易知道实现嗅探的 PHP 类。例如,让我们采取Generic.Commenting.Todo.TaskFound. 前三个标记的意思是:

  1. Generic:它是标准,它定义了标准的文件夹CodeSniffer/Standards/Generic
  2. Commenting:是标准下的嗅探组,也指向标准内的一个文件夹:CodeSniffer/Standards/Generic/Sniffs/Commenting
  3. Todo:它是嗅探器,它在一个名为的类中实现<sniff name>Sniff.php

所以,我们Generic.Commenting.Todo.TaskFound在类中实现了嗅探CodeSniffer/Standards/Generic/Sniffs/Commenting/TodoSniff.php

我们可以反过来做。如果我们知道 PHP 类的路径,我们就能知道 PHP_CodeSniffer 将要报告的嗅探。例如,实现的类CodeSniffer/Standards/Squiz/Sniffs/NamingConventions/ValidFunctionNameSniff.php将生成带有标识符的嗅探Squiz.NamingConventions.ValidFunctionName

于 2015-07-31T06:55:52.707 回答
3

试试这个 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>
于 2017-07-02T02:00:36.310 回答
2

除了源代码之外,没有关于规则的文档。查看不同的标准以及它们如何使用它们。

于 2013-05-08T05:25:36.640 回答
2

Old question but I found this useful: http://pear.php.net/package/PHP_CodeSniffer/docs/latest/

It lists all the files in the Pear package and all the ones that end in "Sniff" are the available checks.

CallTimePassByReferenceSniff

于 2018-05-04T17:07:24.340 回答