Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHPの静的解析 ついでにLarastan

PHPの静的解析 ついでにLarastan

namizatork

June 24, 2021
Tweet

More Decks by namizatork

Other Decks in Programming

Transcript

  1. www.bengo4.com
    PHPの静的解析
    ついでにLarastan
    2021.06.23 namizato

    View Slide

  2. はじめに
    2

    View Slide

  3. 3
    3
    並里 辰也(ナミザト タツヤ)
    自己紹介
    弁護士ドットコム株式会社 在籍そろそろ1年
    Laravelが好きでたまに発表したり記事書いたりしてます
    @namizatork

    View Slide

  4. Bengo4.com, Inc.
    弁護士ドットコム
    というサービス
    ● 一般市民と弁護士を結びつ
    け、お悩み解決を目指す
    ● 2005年サービス開始
    ● 約900万セッション/ 月
    ● 約300件の法律相談/ 日
    4

    View Slide

  5. Bengo4.com, Inc.
    目次
    ● テスト
    ○ 動的テスト
    ○ 静的テスト
    ● PHPStan
    ○ PHPDoc
    ○ levelや範囲などの設定
    ○ CI/CD
    ● Larastan
    ○ 使い方とか
    5

    View Slide

  6. テスト
    6
    みなさんテストコード書いてますか

    View Slide

  7. Bengo4.com, Inc.
    テストには
    動的/静的がある
    (ざっくりね)
    7

    View Slide

  8. 動的テスト
    8

    View Slide

  9. Bengo4.com, Inc.
    動的テスト
    プログラムコードを実行して、その結果からソフトウェアのバグ検出や品質評価、動作確認を行うテスト
    手法のこと(主にUnitテスト、Featureテスト、Browserテストなどが挙げられる)
    ● Unitテスト
    ○ ServiceやModelなどの単位でメソッドの動作検証するテスト
    ● Featureテスト
    ○ 1つのHTTPリクエスト単位の動きを動作検証するテスト
    ● Browserテスト
    ○ ブラウザからボタンやテキスト等の要素を動作検証するテスト
    9

    View Slide

  10. Bengo4.com, Inc.
    動的テスト
    ● 仕様
    ○ 実際にプログラムを実行して行う
    ● メリット
    ○ テストを書いておくことで品質担保にもなる
    ○ テストを書くことで仕様の確認もなる
    ● デメリット
    ○ 実際にプログラムを実行するので、予期せぬトラブルが起きる可能性がある
    ○ 開発者自身が実装するので網羅的なテストが難しい
    ○ 人の手で実装するので、そもそもテスト自体が間違っている可能性がある
    10

    View Slide

  11. 静的テスト
    11

    View Slide

  12. Bengo4.com, Inc.
    静的テスト
    プログラムコードを実行せずにドキュメントやソースコードなどのチェックによって誤りや脆弱性を検出す
    るテスト手法(PHPでは以下のような静的解析ツールが存在する)
    ● PHPstan
    ○ 依存するライブラリがないので手軽に導入できる
    ○ 静的解析だけど一部 PHPが実行される(Composerのautoloadなど)
    ● Phan
    ○ PHPDocを基に解析するので PHPは実行されない
    ○ ext_astというライブラリが必須
    12

    View Slide

  13. Bengo4.com, Inc.
    静的テスト
    ● 仕様
    ○ プログラムを実行せずに解析される(ただし PHPstanは一部実行する)
    ○ 未定義の変数/メソッド/Class/プロパティなどを検出
    ○ その他PHPDocの構文不備や分岐のチェックも
    ● メリット
    ○ 静的に解析される箇所は網羅的にテストができる
    ○ テストを書く必要がないのでコストが少ない
    ○ 変数の未定義など細かいエラーが事前に分かるのでコードレビューの手間が省ける
    ● デメリット
    ○ 無限ループなどは検出できない
    13

    View Slide

  14. PHPStan
    14
    ※ただのコピペです

    View Slide

  15. Bengo4.com, Inc.
    PHPStan
    ● instanceof、catch、typehints、およびその他の言語構造で使用されるクラスの存在。
    ● 呼び出されたメソッドと関数の存在とアクセシビリティ。渡された引数の数。
    ● メソッドが、返すように宣言したのと同じ型を返すかどうか。
    ● アクセスされたプロパティの存在と可視性。また、宣言されたタイプとは異なるタイプがプロパティ
    に割り当てられているかどうか。
    ● フォーマット文字列に基づいて、 sprintf / printf呼び出しに渡されるパラメーターの数。
    ● ブランチとループのスコープの中に変数が存在するかどうか。
    ● (string) 'foo'のような無意味なキャストと、異なる型を厳密に比較していて常に falseになるオペ
    ランド。
    15

    View Slide

  16. PHPDoc
    16
    ただのコメントじゃないよ

    View Slide

  17. Bengo4.com, Inc.
    PHPDoc
    17
    ● コードの見通しが良くなる
    ● IDEの補完が効くようになる
    ● 静的解析ができる

    View Slide

  18. levelや範囲などの設定
    18
    いろいろ柔軟に設定できるよ

    View Slide

  19. Bengo4.com, Inc.
    Levelや範囲などの設定
    19
    ● includes
    ○ 設定ファイルの読み込み
    ● paths
    ○ 対象ファイル
    ● level
    ○ 静的解析のレベル
    ● excludePaths
    ○ 無視ファイル
    ● checkMissingIterableValu
    eType
    ○ 厳密な配列のチェック

    View Slide

  20. CI/CD
    20
    いろいろ柔軟に設定できるよ

    View Slide

  21. Bengo4.com, Inc.
    CI/CD
    もちろんCI/CDを実行する際にも静的解析を走らせることができます
    push時やcommit時など自由に設定が可能です
    CI/CDに静的解析を組み入れることでプルリク時のコードレビューに、
    凡ミス(変数の未定義や型の違い)を指摘する必要がなくなり、結果的に使用や実装だけにフォーカス
    したレビューが行えます
    21

    View Slide

  22. Larastan
    22

    View Slide

  23. Bengo4.com, Inc.
    Larastan
    PHPStanライブラリの拡張ラッパーライブラリです
    LaravelにPHPStanを導入しようとすればファサード周りのエラー(ファサードは実在するクラスではな
    いため)
    その他にもEloquentを使う際の where() や find() にも同様のエラーが起きます
    LarastanではそういったLaravel独自の仕様をフォローして扱える様にしています
    23

    View Slide

  24. 使い方とか
    24

    View Slide

  25. Bengo4.com, Inc.
    Composerで
    Installするだけ
    25

    View Slide

  26. Bengo4.com, Inc.
    あとはPHPStanの様に
    扱えるよ
    26
    ./vendor/bin/phpstan analyze
    と実行するだけで手動で静的解析が
    走ります。
    もちろんPHPStan同様にCI/CDで
    commit時などに自動で走らせると
    いった事もできます

    View Slide

  27. ご清聴ありがとう
    ございました。
    27

    View Slide