バグゼロを目指せ!PsalmによるPHPの静的解析

バグゼロを目指せ!PsalmによるPHPの静的解析 プログラミング

PHPの世界では、バグは避けられない課題です。
しかし、「バグゼロ」はもはや夢物語ではありません。

Psalmを武器に、PHPの静的解析を駆使してコードの質を劇的に向上させることが可能になります。
この記事では、そんなPsalmについて解説しています。

本記事の内容

  • Psalmとは?
  • Psalmのインストール
  • Psalmの動作確認

それでは、上記に沿って解説していきます。

Psalmとは?

PsalmはPHP用の静的解析ツールです。
コードの型安全性を中心に検証し、バグの発見やコード品質の向上を目的としています。

Psalmは、PHPコード内の次のような潜在的な問題を検出する能力があります。

  • 型の不一致
  • 未定義のメソッド呼び出し
  • 配列の不適切な使用

Psalmを使用することで、開発者はコードの問題を早期に特定し、修正することができます。
これにより、開発プロセスが円滑になり、より信頼性の高いアプリケーションを構築することが可能になります。

Psalmは高度に設定可能であり、プロジェクトの特定のニーズに合わせて分析の厳格さのレベルを調整できます。

Psalmの主な特徴は以下。

  • 型推論: PsalmはPHPDocコメントや型宣言を利用して、変数や戻り値の型を推論します。
  • レベル別の分析: Psalmはエラーを異なる深刻度のレベルで報告し、プロジェクトに合わせて分析の厳格さを調整できます。
  • 自動修正の提案: 一部の問題については、Psalmは修正を自動的に提案することがあります。
  • プラグイン機能: 追加の検出ルールを提供するため、カスタムプラグインを統合できます。
  • 継続的インテグレーション: CIツールと連携して、コード変更時に自動で解析を行えます。

静的解析は、コードベースの品質を維持するための重要なプラクティスです。
Psalmを活用することで、エラーを事前に発見し修正でき、より堅牢で安全なPHPアプリケーションの開発を支援します。

Psalmのインストール

Psalmの最新バージョンは、5.23.1となります。
最新版をインストールするには、PHP 7.4以降が必要です。

インストールには、Composerを利用します。

一般的には、以下のコマンドを利用してインストールすることになります。

composer require --dev vimeo/psalm

ただ、既存の環境へのインストールは簡単ではないかもしれません。
既存プロジェクトの依存パッケージと衝突することがあり得るからです。

そのような場合は、Pharを利用すれば解決できます。

wget https://github.com/vimeo/psalm/releases/latest/download/psalm.phar
chmod +x psalm.phar
./psalm.phar --version

Windowsであれば、次のようなコマンドとなります。

wget https://github.com/vimeo/psalm/releases/latest/download/psalm.phar -o psalm.phar
php ./psalm.phar --version

インストールできたら、確認しましょう。
Composerでインストールした場合は、以下コマンドで確認できます。

> .\vendor\bin\psalm --version
Psalm 5.23.1@8471a896ccea3526b26d082f4461eeea467f10a4

Pharを利用する場合は、以下。

> php ./psalm.phar --version
Psalm 5.23.1@8471a896ccea3526b26d082f4461eeea467f10a4

Psalmの動作確認

Psalmを利用するためには、まず初期化の処理が必要です。

./vendor/bin/psalm --init

初期化により、psalm.xmlファイルが作成されます。

psalm.xml

<?xml version="1.0"?>
<psalm
    errorLevel="1"
    resolveFromConfigFile="true"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="https://getpsalm.org/schema/config"
    xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
    findUnusedBaselineEntry="true"
    findUnusedCode="true"
>
    <projectFiles>
        <file name="vendor/autoload.php" />
        <file name="vendor/composer/autoload_classmap.php" />
        <file name="vendor/composer/autoload_files.php" />
        <file name="vendor/composer/autoload_namespaces.php" />
        <file name="vendor/composer/autoload_psr4.php" />
        <file name="vendor/composer/autoload_real.php" />
        <file name="vendor/composer/autoload_static.php" />
        <file name="vendor/composer/ClassLoader.php" />
        <file name="vendor/composer/installed.php" />
        <file name="vendor/composer/InstalledVersions.php" />
        <ignoreFiles>
            <directory name="vendor" />
        </ignoreFiles>
    </projectFiles>
</psalm>

このファイルは、自分で作成することも可能です。

<?xml version="1.0"?>
<psalm>
    <projectFiles>
        <directory name="src" />
    </projectFiles>
</psalm>

対象のディレクトリやファイルは、に記入します。
今回は、「 <directory name=”src” /> 」を追加しましょう。

実際にsrcディレクトリを作成して、そこにPHPのファイルを保存します。

test.php

<?php

function sayHello(string $name): string {
    return "Hello, " . $name;
}

echo sayHello(42);

?>

準備ができたので、解析してみましょう。

./vendor/bin/psalm

そうすると、以下のようなエラーが表示されます。

型の不一致が原因となっています。
test.phpを修正します。

文字型に変更です。

echo sayHello("42");

再度、解析するとエラーがなくなっています。

タイトルとURLをコピーしました