deeem/hexlet-psr-linter

此包已被 废弃 且不再维护。未建议替代包。

v1.0 2016-08-16 19:35 UTC

This package is not auto-updated.

Last update: 2020-10-16 21:39:57 UTC


README

Build Status Code Climate Test Coverage Issue Count

关于

Линтер,用于检查PHP代码是否符合某些规则,并输出违规报告,并提供修复代码的功能(如果规则中描述了修复函数)。该项目在hexlet.io实习期间完成。

要求

  • PHP >= 7.0
  • Composer

安装

  1. 通过克隆git仓库进行安装
git clone https://github.com/deeem/hexlet-psr-linter
cd hexlet-psr-linter
make install
  1. 使用composer进行安装
composer require deeem/hexlet-psr-linter
  1. 使用composer.json进行安装
"require": {
    "deeem/hexlet-psr-linter": "*"
}

使用命令行

例如,使用ruleset.json中的规则在myProject目录中检查代码,ruleset.json~/mySniffs目录加载

bin/psr-linter myProject --sniffs ~/mySniffs --ruleset ruleset.json

json文件的格式是普通的数组

[
  "FunctionsNamingForCamelCase",
  "VariablesNamingForCamelCase",
  "VariablesNamingForLeadUnderscore"
]

更多参数请参阅帮助文档

bin/psr-linter --help

如果psr-linter已全局安装,可以创建对bin文件的链接,以便于调用

ln -s path-to-bin/psr-linter /usr/local/bin/psr-linter

之后可以输入以下命令来调用

psr-linter

使用库

负责创建linter的函数是makeLinter,它接受一个对象数组作为参数,该对象是RulesInterface的子类,并接受一个自动修复标志,返回一个函数,该函数接受原始代码作为字符串参数。如果提供了这样的参数,返回包含错误和修复后代码的数组。

<?php
$code = file_get_contents('tests/fixtures/sniffs/variablesNamingForLeadingUnderscore.wrong.php');

require_once 'sniffs/VariablesNamingForLeadUnderscore.php';
$lint = makeLinter([new Rules\VariablesNamingForLeadUnderscore()]);
$linterReport = $lint($code);

创建规则

最初包含一些具有演示性质的规则,但实际工作需要创建自己的规则集进行检查。

规则分为两类,根据是否可以自动修复违规行为

  • 定义不能自动修复的违规(例如,副作用)
  • 定义并自动修复违规(例如,将变量名转换为camelCase形式)

要创建新规则,需要创建相应类的实例:在第一种情况下是CheckersTemplate,在可以添加自动修复的情况下是FixersTemplate

例如,检查变量名是否符合camelCase命名规范的规则

<?php

namespace PsrLinter\Rules;

class VariablesNamingForCamelCase extends FixersTemplate implements RulesInterface
{
    public function check(\PhpParser\Node $node)
    {
        if (( $node instanceof \PhpParser\Node\Expr\Variable ) &&
            (!preg_match('/^[a-z]+([A-Z]?[a-z]+)+$/', $node->name))) {
            $this->addError($node, 'error', 'Names MUST be declared in camelCase.');

            return true;
        }
    }

    public function fix(\PhpParser\Node $node)
    {
        $camelize = function ($word) {
            $allWordsAreUpperCased = implode(array_map(function ($word) {
                return ucfirst(strtolower($word));
            }, explode('_', $word)));

            return lcfirst($allWordsAreUpperCased);
        };

        $node->name = $camelize($node->name);
    }
}

其他示例位于shiffs目录中