Skip to content

PhanでPHP静的解析2018

公開日:

東京都渋谷区GMO Yoursで開催された『第126回 PHP勉強会@東京』でライトニングトーク(5分)として発表しました。

Download PDF

スライドテキスト

Page 1

PhanでPHPコード静的解析2018

Static analysis of PHP code using Phan.

2018-05-30 PHP勉強会@東京 #phpstudy

Page 2

お前誰よ

  • うさみけんた (@tadsan) / Zonu.EXE
  • GitHub/Packagistでは id: zonuexe
  • ピクシブ株式会社 pixiv運営本部
  • Emacs Lisper, PHPer
  • Emacs PHP Modeのメンテナ引き継ぎました
  • 好きなリスプはEmacs Lispです
  • Qiitaに記事を書いたり変なコメントしてるよ

Page 3

Page 4

We are hiring!

Page 5

近況報告

Page 6

Page 7

Page 8

Page 9

そして

Page 10

Page 11

Phanって何

Page 12

Page 13

Page 14

今回は最近のPhanについて軽くまとめます

Page 15

最近のPhanの動向

Page 16

相変らず恐しいペースで開発が進んでる

Page 17

Page 18

連想配列の静的解析の鬼

Page 19

LSPの実装

Page 20

復讐

Page 21

静的解析とは

Page 22

Page 23

実行して調べるのが動的解析

Page 24

実行せず調べるのが静的解析

Page 25

Xdebug, phpdbgなどのデバッガは動的解析

Page 26

PHPUnitなどのテスティングフレームワークも動的解析

Page 27

php -l は静的解析

Page 28

Page 29

PHPStanは実行時情報を使って静的解析する

Page 30

Phanはコードを実行せず静的解析する

Page 31

得意なことがちょっと異なる

Page 32

導入しやすさもちょっと異なる

Page 33

@tadsanはPHPStanもPhanも両方使ってます

Page 34

詳しいことは直接きいて

Page 35

(ここまで5分)

Page 36

Phanを使ってできること

Page 37

説明

Page 38

“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

Page 39

“Phanは偽陽性を最小化することを好むPHP静的解析器です。Phanは正しいと証明することよりも誤りであることを証明しようとします。”

https://github.com/phan/phan

Page 40

Phanでエラーが検出されなければ正しく動く…わけではない

Page 41

Phanでエラーが検出されるからコードは動かない…わけではない

Page 42

「動かないかもしれない」

ちゃんとしてないコードから怪しい箇所を検出するのに強い

Page 43

で、Phanは何をやってくれるの?

Page 44

ざっくり

Page 45

要はPhpStormを使ってできるような検査ができる

Page 46

ざっくりとPhanのできること

存在しないクラスやメソッドの使用

引数の型のミスマッチや過不足

コードとPHPDocの不整合

存在しないプロパティのアクセス

PHP7と非互換な文法

非推奨な機能の使用 (@deprecated)

Page 47

比較的最近実装された機能

LSP (Language Server Protocol)

VSCなどから利用できる

設定ファイルの自動生成

composer.jsonからの設定取り込み

未使用変数・デッドコード検出機能

Page 48

PSR-5(abandoned) 型表記を実装

@param, @return, @var, @method@property に優先する @phan-付きのPHPDocタグが追加

独自の拡張形式で型を記述できる

Closure(int|array): (int[])

@phan-param array{field:string}

Page 49

Phanを導入しよう

Page 50

三択

Page 51

A. Pharアーカイブ

(超おてがる)

B. Docker

(ただしバージョン古すぎる)

C. Composer

(依存関係の管理がだるい)

Page 52

A. Pharアーカイブ

(超おてがる)

B. Docker

(ただしバージョン古すぎる)

C. Composer

(依存関係の管理がだるい)

Page 53

Page 54

Pharアーカイブのメリット

導入も更新もPharファイルをダウンロードするだけ! 超カンタン

ただし、PHPの実行環境は必要

ファイルをダウンロードしてmv phan.phar ~/local/bin/phan chmod +x ~/local/bin/phan

Page 55

Dockerのメリット

Dokcerの動く環境なら超カンタン!

Phan 0.9.4を最後に音沙汰がない…まあPHP7.1サポートされてるし動くけど…

Page 56

Composerのメリット

あるかなあ… (疑問)

どうしてもPhanのHEADを攻めたいならComposerで入れる

composer require --dev でプロジェクトに入れるのはオススメしない

やるなら composer global require

Page 57

どうやって動かすの

Page 58

Composerの初期設定

プロジェクトルートがある場所でphan --init を実行すると.phan/config.php が自動生成されるphan -o phan.log のように実行するとphan.logに行区切りのレポートが表示される

Page 59

Phan以外の最近の動向

Page 60

PHPStan

Page 61

PHPStan

Phanとキャラかぶりしてるので比較されがち

Phanが全体を解析するのが基本で遅いけど、PHPStanはファイルごとに解析するとかに向いてる

Page 62

PHPStan

PullRequestごとにテストするならPhanよりもPHPStan

高速に解析できるので、作業中に常時解析しまくってもよい

Emacsで編集中に表示するとPhpStormっぽくなるぞ!!!1

https://github.com/emacs-php/phpstan.el

Page 63

Phpactor

Page 64

Page 65

Phpactor

これも静的解析ツールだけど、補完や定義ジャンプ、定義の挿入やリファクタリングなどのエディタ向けのツールセットを提供

いままでリファクタリングはPhpStorm独擅場だったが、これを崩せるポテンシャルがある

Page 66

Phpactor

エディタに依存しない操作

標準でvimプラグインがある

Emacs版の実装は私が開発中

https://github.com/emacs-php/phpactor.el

オレオレ

開発中感はあるけど、いちおう動く

Page 67

最後に

Page 68