PHPStanのBaselineってPHPファイルで作れるらしいね
はじめに
PHPStanのBaselineの作り方などを調べるためにマニュアルを眺めていたら、PHPファイル形式でも作成することができるようです。
そこでPHPファイル形式を試してみようと思います。
環境
- PHP 8.2.6
- PHPStan 1.10.15
いつから作成できるようになった
いつごろから作成できるようになったのかリリースノートを見ると1.10.2からのようですね。
サンプルコード
PHPStanで解析するコードはこちらに用意した内容を利用します。
※1ファイルだけなので載せておきます。
<?php
// 存在しないクラス
$model = new Model();
// 存在しない関数
func();
class Sample
{
public function get()
{
// 未定義のプロパティ
return $this->property;
}
}
とりあえず、試しにレベル0で解析してみると何かしらエラーが出ていますね。
vendor/bin/phpstan analyse src -l 0
1/1 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
------ --------------------------------------------------------------------------------------
Line index.php
------ --------------------------------------------------------------------------------------
4 Instantiated class Model not found.
💡 Learn more at https://phpstan.org/user-guide/discovering-symbols
7 Function func not found.
💡 Learn more at https://phpstan.org/user-guide/discovering-symbols
14 Access to an undefined property Sample::$property.
💡 Learn more: https://phpstan.org/blog/solving-phpstan-access-to-undefined-property
------ --------------------------------------------------------------------------------------
[ERROR] Found 3 errors
PHPファイル形式を試してみます
まずはPHPファイル形式でBaselineを作成します。
作成するにはBaselineを作成する時と同じオプション(--generate-baseline、または、-b
)を使い、
ファイルの拡張子が.php
を指定しておけば大丈夫なようです。
vendor/bin/phpstan analyse src -l 0 -b phpstan-baseline.php
1/1 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
[OK] Baseline generated with 3 errors.
phpstan-baseline.php
ができていると思います。
※ファイル名を指定していない場合は、phpstan-baseline.neon
で作成されますね。
中身はこんな感じです
<?php declare(strict_types = 1);
$ignoreErrors = [];
$ignoreErrors[] = [
'message' => '#^Access to an undefined property Sample\\:\\:\\$property\\.$#',
'count' => 1,
'path' => __DIR__ . '/src/index.php',
];
$ignoreErrors[] = [
'message' => '#^Function func not found\\.$#',
'count' => 1,
'path' => __DIR__ . '/src/index.php',
];
$ignoreErrors[] = [
'message' => '#^Instantiated class Model not found\\.$#',
'count' => 1,
'path' => __DIR__ . '/src/index.php',
];
return ['parameters' => ['ignoreErrors' => $ignoreErrors]];
※ ちなみにneonファイルだとこんな感じです。
parameters:
ignoreErrors:
-
message: "#^Access to an undefined property Sample\\:\\:\\$property\\.$#"
count: 1
path: src/index.php
-
message: "#^Function func not found\\.$#"
count: 1
path: src/index.php
-
message: "#^Instantiated class Model not found\\.$#"
count: 1
path: src/index.php
次にphpstan-baseline.php
をphpstan.neon
で読み込みます。
ついでにpath
とlevel
の指定もこちらに書いておきます。
includes:
- phpstan-baseline.php
parameters:
paths:
- src
level: 0
読み込んだ状態で改めて解析してみます。
vendor/bin/phpstan analyse -c phpstan.neon
1/1 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
[OK] No errors
エラーは無くなりましたね。
まとめ
今回は、PHPファイル形式のBaselineを試してみました。
neonファイル形式の時に比べるとPHPファイル形式の方が慣れているので大変見やすいですね。
また、マニュアルには
neonファイルで作るよりも、解析パフォーマンス、メモリ消費を軽減するのに役立つ可能性がある
と書かれているので、利用可能なバージョンを使っている場合は、PHPファイルで作った方がいいのかもしれないですね。
Discussion