Phanで静的解析するようにしてみる
なんかもうアレなので業務でとあるAPIを叩く用の簡単なSDKをを作った。 その際PHPDoc,型宣言とかしたので、せっかくなのでPhanで静的解析するようにしてみたメモ。 PhanはPHPDoc,型宣言などが整備されてないと真価を発揮しないということなので。
install
- ast-extが必要
pecl install ast
- phan install
composer require --dev phan/phan
config
./phan/config.php
のファイルを作って設定定義- See : https://github.com/phan/phan/blob/master/src/Phan/Config.php
- sample
<?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