PHP_CodeSnifferを使い倒すためにカスタムルールを作ってみた
はじめに
PHP_CodeSnifferを日々使ってコードをチェックしておりますが、
もっと使い倒すための1歩として試しにカスタムルールを作ってみました。
環境
作成していたMacBookに入っていたバージョンです。
※2023/05/20時点
- PHP 8.2.6
- PHP_CodeSniffer 3.7.2
作ったもの
GitHubに置いてあります。
どんなルールを作ったのか
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
は廃止される流れだったのでルールを作成してみました。
phpcbf
コマンドを実行すれば、OKの形に変換できるように対応してあります。
ただ、Attributesには未対応なので、将来的には対応したいところですね。
ちなみにRectorにも存在していることを作成中に発見しています。
まとめ
PHP_CodeSnifferのルールを試しに作ってみました。
公式チュートリアルを見ながらやれば必要なファイルやディレクトリ構成は把握できましたが、
PHP_CodeSniffer\Files\File
のgetTokens
メソッドで取得する配列の中身を解析するのはとても辛かったです。※正直、いまだによくわかっていないです。
少し時間が空くと忘れそうなので、定期的に既存のルールを眺めて理解を深めていこうと思います。
また、今回テストコードを作成していないので、何かしらテストは追加したいと思います。
→ 追加しました✨
Discussion
逆の「変数名はキャメルケース以外はダメ」なルールはありましたが(ご存知でしたら失礼しました)、スネークケースで命名しているプロジェクトもあると思うので良さそうですね!
ありがとうございます
そうなんですよね
キャメルケースはチェックできて、スネークケースはチェックできないってなったの今回作ってみようと思ったきっかけですね
(実際キャメルケースを採用しているプロジェクトが多いと思うので、スネークケースが異端なのかもしれないですが...)