👋

PHPStanのBaselineってPHPファイルで作れるらしいね

2023/06/05に公開

はじめに

PHPStanのBaselineの作り方などを調べるためにマニュアルを眺めていたら、PHPファイル形式でも作成することができるようです。

https://phpstan.org/user-guide/baseline#php-baseline-format-instead-of-neon

そこでPHPファイル形式を試してみようと思います。

環境

  • PHP 8.2.6
  • PHPStan 1.10.15

いつから作成できるようになった

いつごろから作成できるようになったのかリリースノートを見ると1.10.2からのようですね。
https://github.com/phpstan/phpstan/releases/tag/1.10.2

サンプルコード

PHPStanで解析するコードはこちらに用意した内容を利用します。

※1ファイルだけなので載せておきます。

src/index.php
<?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で作成されますね。

中身はこんな感じです

phpstan-baseline.php
<?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ファイルだとこんな感じです。

phpstan-baseline.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.phpphpstan.neonで読み込みます。
ついでにpathlevelの指定もこちらに書いておきます。

phpstan.neon
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ファイルで作った方がいいのかもしれないですね。

GitHubで編集を提案

Discussion