试用 PHP CodeSniffer

PHP_CodeSniffer是什么

进行代码规范检查的工具。由于v2.X版本开始,可以进行修正,因此尝试一下。

请参考维基百科以获取详细信息。

安装

只要在composer的require-dev中添加即可。

有针对各种框架的约定定义也存在。
这次我们将使用FuelPHP的。
⇒ eviweb/fuelphp-phpcs

{
    "require-dev": {
        "squizlabs/php_codesniffer": "2.*",
        "eviweb/fuelphp-phpcs": "dev-master"
    }
}

通过Composer进行附加安装

$ php composer.phar update squizlabs/php_codesniffer eviweb/fuelphp-phpcs

使得php_codesniffer可以引用fuelphp-phpcs的配置

$ fuel/vendor/bin/phpcs --config-set installed_paths fuel/vendor/eviweb/fuelphp-phpcs/Standards

确认已添加FuelPHP。

$ fuel/vendor/bin/phpcs --config-show
installed_paths: /var/www/html/fuel/vendor/eviweb/fuelphp-phpcs/Standards
$ vendor/bin/phpcs -i
The installed coding standards are MySource, PEAR, PHPCS, PSR1, PSR2, Squiz, Zend and FuelPHP

代码约定检查 (Mandarin Chinese)

只需要一个选项

    標準ルール指定
$ fuel/vendor/bin/phpcs  --standard=FuelPHP {path}
    拡張子指定
$ fuel/vendor/bin/phpcs  --extensions=php {path}

我试着进行检查

$ fuel/vendor/bin/phpcs --standard=FuelPHP --extensions=php fuel/app/classes
FILE: /var/www/html/fuel/app/classes/view/welcome/404.php
----------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
----------------------------------------------------------------------
 29 | ERROR | Array with multiple values cannot be declared on a
    |       | single line
----------------------------------------------------------------------

Time: 294ms; Memory: 3.5Mb

默认文件被卡住了。
在Fuel的代码规范中,即使是多项数组也可以在一行中定义。。

$array = [1, 2, 3, 4];

我要尝试取消这个勾选项。

单独制定规则

    • xmlでルールを定義する

 

    • 既存のルールを継承して、一部の規約を除外する等の設定が可能

 

    • 全く新規のチェックを実装することも可能

新規ルールの実装方法はチュートリアル参照

我們將創建一個自定義規則,該規則將取消對上述FuelPHP中不能在同一行聲明具有多個值的數組的檢查。

    • チェック処理はfuel/vendor/eviweb/fuelphp-phpcs/Standards/FuelPHP/Sniffs/Arrays/ArrayDeclarationSniff.phpに記述されていた

 

    基本的に$phpcsFile->addError($error, $stackPtr, ‘SingleLineNotAllowed’)という感じで、addError()の第3引数にルール名がセットされているようなので、エラーメッセージから除外したいルール名を見つけられる
if (($conditionCheck === false) || ($tokens[$conditionCheck]['line'] !== $tokens[$stackPtr]['line'])) {
    $error = 'Array with multiple values cannot be declared on a single line';
    $phpcsFile->addError($error, $stackPtr, 'SingleLineNotAllowed');
    return;
}
<?xml version="1.0" encoding="UTF-8"?>

<ruleset name="Fuel_Custom">
    <description>
        Customize Coding standards for FuelPHP
    </description>

    <exclude-pattern>tests/*</exclude-pattern>

    <!-- 継承するルールを指定 -->
    <rule ref="FuelPHP">
        <!-- 除去する個別ルールを指定 -->
        <exclude name="FuelPHP.Arrays.ArrayDeclaration.SingleLineNotAllowed"/>
    </rule>
</ruleset>

指定 ruleset.xml 进行检查。

$ fuel/vendor/bin/phpcs --standard=ruleset.xml --extensions=php fuel/app/classes

似乎平安无事的样子。

如果只有1或2个想要排除的规则,可以通过命令参数来排除。但是根据查看的帮助信息,似乎无法实现。

修改

$ fuel/vendor/bin/phpcbf fuel/app/classes
    • 自動で修正できれば直してくれる

 

    上記のSingleLineNotAllowedエラーに関しては自動修正してくれなかった。。

引起关注的事项

    インデントはタブで入力する規則だが、タブタブ半角SPのように先頭がタブだと通ってしまう
广告
将在 10 秒后关闭
bannerAds