🐥

PHP_CodeSnifferを使い倒すためにカスタムルールを作ってみた

2023/05/20に公開
2

はじめに

PHP_CodeSnifferを日々使ってコードをチェックしておりますが、
もっと使い倒すための1歩として試しにカスタムルールを作ってみました。

環境

作成していたMacBookに入っていたバージョンです。
※2023/05/20時点

  • PHP 8.2.6
  • PHP_CodeSniffer 3.7.2

作ったもの

GitHubに置いてあります。

https://github.com/naopusyu/phpcs-custom-rules

どんなルールを作ったのか

PHPCSCustomRules.NamingConventions.SnakeCaseVariableName

変数名はスネークケース以外はダメってルール

// OK
$snake_case = 1;

// NG
$camelCase = 2;

変数名の命名規則のルールってなかったりしたので作成してみました。
今回は変数名に対して、スネークケース以外ならエラーにするようにしていますが、キャメルケースを採用しているパッケージのコードを拡張していると誤検知すると思うので、除外できるように改善は必要かなって思っています。

// パッケージにあるコード
class A 
{
    public string $propertyName = 'abc';
}

// パッケージのコードを拡張してみた
class B extends A
{
    // 拡張したがスネークケースでないのでエラーになるのでこれは除外するのが今後の課題
    public string $propertyName = 'def';
}

PHPCSCustomRules.PHPUnit.DeprecatedTestAnnotation

PHPUnitの@testアノテーションは使わないでメソッド名のプレフィックスにtestをつけてくださいってルール

// OK
public function testSelect()
{
}

// NG
/**
 * @test
 */
public function select()
{
}

こちらは、PHPUnitのissuesを眺めていたら、将来的に@testは廃止される流れだったのでルールを作成してみました。
https://github.com/sebastianbergmann/phpunit/issues/4505

phpcbfコマンドを実行すれば、OKの形に変換できるように対応してあります。
ただ、Attributesには未対応なので、将来的には対応したいところですね。

ちなみにRectorにも存在していることを作成中に発見しています。
https://github.com/rectorphp/rector-phpunit/blob/main/docs/rector_rules_overview.md#replacetestannotationwithprefixedfunctionrector

まとめ

PHP_CodeSnifferのルールを試しに作ってみました。

公式チュートリアルを見ながらやれば必要なファイルやディレクトリ構成は把握できましたが、
PHP_CodeSniffer\Files\FilegetTokensメソッドで取得する配列の中身を解析するのはとても辛かったです。※正直、いまだによくわかっていないです。
少し時間が空くと忘れそうなので、定期的に既存のルールを眺めて理解を深めていこうと思います。

また、今回テストコードを作成していないので、何かしらテストは追加したいと思います。

→ 追加しました✨
https://zenn.dev/naopusyu/articles/2a9fe7f049d5dc

GitHubで編集を提案

Discussion

muno92muno92

https://github.com/squizlabs/PHP_CodeSniffer/blob/2dc7b5981488502fed92df99c1460530d741e666/src/Standards/Squiz/Sniffs/NamingConventions/ValidVariableNameSniff.php#L180
逆の「変数名はキャメルケース以外はダメ」なルールはありましたが(ご存知でしたら失礼しました)、スネークケースで命名しているプロジェクトもあると思うので良さそうですね!

なおなお

ありがとうございます

そうなんですよね
キャメルケースはチェックできて、スネークケースはチェックできないってなったの今回作ってみようと思ったきっかけですね
(実際キャメルケースを採用しているプロジェクトが多いと思うので、スネークケースが異端なのかもしれないですが...)