恥知らずのウェブエンジニア -web engineer, shameless

これは一歩を踏み出すことができない者たちのブログ

Phanで静的解析するようにしてみる

なんかもうアレなので業務でとあるAPIを叩く用の簡単なSDKをを作った。 その際PHPDoc,型宣言とかしたので、せっかくなのでPhanで静的解析するようにしてみたメモ。 PhanはPHPDoc,型宣言などが整備されてないと真価を発揮しないということなので。

install

  • ast-extが必要
pecl install ast
  • phan install
composer require --dev phan/phan

config

<?php
return [
//解析、パース対象dir
    'directory_list' => [
        'src',
        'vendor/' 
    ],
//解析除外対象dir
    "exclude_analysis_directory_list" => [
        'vendor/'
    ],
];

実行

./vendor/bin/phan

src/xxxxRequest.php:16 PhanUndeclaredTypeProperty Property xxxxx\AbstractRequest::request has undeclared type \xxxxx\Message
src/xxxxPoint.php:13 PhanUndeclaredClassConstant Reference to constant class from undeclared class \xxxxx\Request

こんな感じで解析結果がでーる

まだそこまでありがたみを感じていないがしばらく様子見してみる

Tips

PhanUndeclared~が出る

  • 未定義〜を呼んでいるとかとか
  • Phanはautoloadを行わない。なのでコード内でcomposerで入れたクラスなどを参照している場合、それらも解析対象にしなければいけない
  • Issue-Types-Caught-by-Phan
  • https://github.com/phan/phan/wiki/Issue-Types-Caught-by-Phan
  • ./phan/config.phpに↓のようにしてvendor以下もパース対象にしつつ解析除外にする
    'directory_list' => [
        'src',
        'vendor/' 
    ],
    "exclude_analysis_directory_list" => [
        'vendor/'
    ],

dead code検出

  • 実行時optionで、-x, --dead-code-detectionを付けると未使用の関数、変数等を検出してくれる
    ./vendor/bin/phan --dead-code-detection

    src/Client.php:38 PhanUnreferencedPrivateMethod Possibly zero references to 
    private method \xxxxx\Client::aaa

pluginを書けば独自ルールで解析を行うこともできるっぽい