👋

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

Discussion