Page 1
PhanでPHPコード静的解析2018
Static analysis of PHP code using Phan.
2018-05-30 PHP勉強会@東京 #phpstudy
公開日:
by USAMI Kenta@tadsan
に東京都渋谷区のGMO Yoursで開催された『第126回 PHP勉強会@東京』でライトニングトーク(5分)として発表しました。
Static analysis of PHP code using Phan.
2018-05-30 PHP勉強会@東京 #phpstudy
We are hiring!
近況報告
そして
Phanって何
今回は最近のPhanについて軽くまとめます
最近のPhanの動向
相変らず恐しいペースで開発が進んでる
連想配列の静的解析の鬼
LSPの実装
復讐
静的解析とは
実行して調べるのが動的解析
実行せず調べるのが静的解析
Xdebug, phpdbgなどのデバッガは動的解析
PHPUnitなどのテスティングフレームワークも動的解析
php -l は静的解析
PHPStanは実行時情報を使って静的解析する
Phanはコードを実行せず静的解析する
得意なことがちょっと異なる
導入しやすさもちょっと異なる
@tadsanはPHPStanもPhanも両方使ってます
詳しいことは直接きいて
(ここまで5分)
Phanを使ってできること
説明
“Phan is a static analyzer for PHP that prefers to minimize false-positives.Phan attempts to prove incorrectness rather than correctness.”
https://github.com/phan/phan
“Phanは偽陽性を最小化することを好むPHP静的解析器です。Phanは正しいと証明することよりも誤りであることを証明しようとします。”
https://github.com/phan/phan
Phanでエラーが検出されなければ正しく動く…わけではない
Phanでエラーが検出されるからコードは動かない…わけではない
「動かないかもしれない」
ちゃんとしてないコードから怪しい箇所を検出するのに強い
で、Phanは何をやってくれるの?
ざっくり
要はPhpStormを使ってできるような検査ができる
存在しないクラスやメソッドの使用
引数の型のミスマッチや過不足
コードとPHPDocの不整合
存在しないプロパティのアクセス
PHP7と非互換な文法
非推奨な機能の使用 (@deprecated)
LSP (Language Server Protocol)
VSCなどから利用できる
設定ファイルの自動生成
composer.jsonからの設定取り込み
未使用変数・デッドコード検出機能
PSR-5(abandoned) 型表記を実装
@param, @return, @var, @method@property に優先する @phan-付きのPHPDocタグが追加
独自の拡張形式で型を記述できる
Closure(int|array): (int[])
@phan-param array{field:string}
Phanを導入しよう
三択
(超おてがる)
(ただしバージョン古すぎる)
(依存関係の管理がだるい)
(超おてがる)
(ただしバージョン古すぎる)
(依存関係の管理がだるい)
導入も更新もPharファイルをダウンロードするだけ! 超カンタン
ただし、PHPの実行環境は必要
ファイルをダウンロードしてmv phan.phar ~/local/bin/phan chmod +x ~/local/bin/phan
Dokcerの動く環境なら超カンタン!
Phan 0.9.4を最後に音沙汰がない…まあPHP7.1サポートされてるし動くけど…
あるかなあ… (疑問)
どうしてもPhanのHEADを攻めたいならComposerで入れる
composer require --dev でプロジェクトに入れるのはオススメしない
やるなら composer global require
どうやって動かすの
プロジェクトルートがある場所でphan --init を実行すると.phan/config.php が自動生成されるphan -o phan.log のように実行するとphan.logに行区切りのレポートが表示される
Phan以外の最近の動向
PHPStan
Phanとキャラかぶりしてるので比較されがち
Phanが全体を解析するのが基本で遅いけど、PHPStanはファイルごとに解析するとかに向いてる
PullRequestごとにテストするならPhanよりもPHPStan
高速に解析できるので、作業中に常時解析しまくってもよい
Emacsで編集中に表示するとPhpStormっぽくなるぞ!!!1
https://github.com/emacs-php/phpstan.el
Phpactor
これも静的解析ツールだけど、補完や定義ジャンプ、定義の挿入やリファクタリングなどのエディタ向けのツールセットを提供
いままでリファクタリングはPhpStorm独擅場だったが、これを崩せるポテンシャルがある
エディタに依存しない操作
標準でvimプラグインがある
Emacs版の実装は私が開発中
https://github.com/emacs-php/phpactor.el
オレオレ
開発中感はあるけど、いちおう動く
最後に
