PhanでPHP静的解析2018

公開日:

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