Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHPの静的解析 ついでにLarastan
Search
namizatork
June 24, 2021
Programming
1
540
PHPの静的解析 ついでにLarastan
namizatork
June 24, 2021
Tweet
Share
More Decks by namizatork
See All by namizatork
PHPのエラーを理解して適切なエラーハンドリングを学ぼう
namizatork
2
3.6k
もう細かいレビューは したくない、されたくない
namizatork
1
1.4k
Laravel8.xまでの大きな変更点を振り返る
namizatork
0
500
Livewireは魔法??コードリーディング してみた
namizatork
1
320
Laravelワカンネ(゚⊿゚)から「完全に理解した()」までステップアップ
namizatork
1
1.1k
Laravelの「Hello World」を 表示するまでの処理を追ってみた
namizatork
0
1.3k
Laravel Hands-on
namizatork
0
340
SPA/PWA/AMPってなに?
namizatork
1
17k
Other Decks in Programming
See All in Programming
Cursor Meetup Tokyo ゲノミクスとCursor: 進化と制約のあいだ
koido
1
310
ts-morph実践:型を利用するcodemodのテクニック
ypresto
1
540
TypeScript製IaCツールのAWS CDKが様々な言語で実装できる理由 ~他言語変換の仕組み~ / cdk-language-transformation
gotok365
7
380
Cloudflare Realtime と Workers でつくるサーバーレス WebRTC
nekoya3
0
240
TypeScript Language Service Plugin で CSS Modules の開発体験を改善する
mizdra
PRO
3
2.4k
Proxmoxをまとめて管理できるコンソール作ってみました
karugamo
1
410
AI Coding Agent Enablement in TypeScript
yukukotani
17
7.2k
REST API設計の実践 – ベストプラクティスとその落とし穴
kentaroutakeda
2
320
Rails産でないDBを Railsに引っ越すHACK - Omotesando.rb #110
lnit
1
100
SpringBootにおけるオブザーバビリティのなにか
irof
1
890
CQRS/ESのクラスとシステムフロー ~ RailsでフルスクラッチでCQRSESを組んで みたことから得た学び~
suzukimar
0
190
What Spring Developers Should Know About Jakarta EE
ivargrimstad
1
610
Featured
See All Featured
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
840
How to Think Like a Performance Engineer
csswizardry
23
1.6k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
What's in a price? How to price your products and services
michaelherold
245
12k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
14
1.5k
Mobile First: as difficult as doing things right
swwweet
223
9.6k
Become a Pro
speakerdeck
PRO
28
5.4k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
Practical Orchestrator
shlominoach
188
11k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Reflections from 52 weeks, 52 projects
jeffersonlam
349
20k
Testing 201, or: Great Expectations
jmmastey
42
7.5k
Transcript
www.bengo4.com PHPの静的解析 ついでにLarastan 2021.06.23 namizato
はじめに 2
3 3 並里 辰也(ナミザト タツヤ) 自己紹介 弁護士ドットコム株式会社 在籍そろそろ1年 Laravelが好きでたまに発表したり記事書いたりしてます @namizatork
Bengo4.com, Inc. 弁護士ドットコム というサービス • 一般市民と弁護士を結びつ け、お悩み解決を目指す • 2005年サービス開始 •
約900万セッション/ 月 • 約300件の法律相談/ 日 4
Bengo4.com, Inc. 目次 • テスト ◦ 動的テスト ◦ 静的テスト •
PHPStan ◦ PHPDoc ◦ levelや範囲などの設定 ◦ CI/CD • Larastan ◦ 使い方とか 5
テスト 6 みなさんテストコード書いてますか
Bengo4.com, Inc. テストには 動的/静的がある (ざっくりね) 7
動的テスト 8
Bengo4.com, Inc. 動的テスト プログラムコードを実行して、その結果からソフトウェアのバグ検出や品質評価、動作確認を行うテスト 手法のこと(主にUnitテスト、Featureテスト、Browserテストなどが挙げられる) • Unitテスト ◦ ServiceやModelなどの単位でメソッドの動作検証するテスト •
Featureテスト ◦ 1つのHTTPリクエスト単位の動きを動作検証するテスト • Browserテスト ◦ ブラウザからボタンやテキスト等の要素を動作検証するテスト 9
Bengo4.com, Inc. 動的テスト • 仕様 ◦ 実際にプログラムを実行して行う • メリット ◦
テストを書いておくことで品質担保にもなる ◦ テストを書くことで仕様の確認もなる • デメリット ◦ 実際にプログラムを実行するので、予期せぬトラブルが起きる可能性がある ◦ 開発者自身が実装するので網羅的なテストが難しい ◦ 人の手で実装するので、そもそもテスト自体が間違っている可能性がある 10
静的テスト 11
Bengo4.com, Inc. 静的テスト プログラムコードを実行せずにドキュメントやソースコードなどのチェックによって誤りや脆弱性を検出す るテスト手法(PHPでは以下のような静的解析ツールが存在する) • PHPstan ◦ 依存するライブラリがないので手軽に導入できる ◦
静的解析だけど一部 PHPが実行される(Composerのautoloadなど) • Phan ◦ PHPDocを基に解析するので PHPは実行されない ◦ ext_astというライブラリが必須 12
Bengo4.com, Inc. 静的テスト • 仕様 ◦ プログラムを実行せずに解析される(ただし PHPstanは一部実行する) ◦ 未定義の変数/メソッド/Class/プロパティなどを検出
◦ その他PHPDocの構文不備や分岐のチェックも • メリット ◦ 静的に解析される箇所は網羅的にテストができる ◦ テストを書く必要がないのでコストが少ない ◦ 変数の未定義など細かいエラーが事前に分かるのでコードレビューの手間が省ける • デメリット ◦ 無限ループなどは検出できない 13
PHPStan 14 ※ただのコピペです
Bengo4.com, Inc. PHPStan • instanceof、catch、typehints、およびその他の言語構造で使用されるクラスの存在。 • 呼び出されたメソッドと関数の存在とアクセシビリティ。渡された引数の数。 • メソッドが、返すように宣言したのと同じ型を返すかどうか。 •
アクセスされたプロパティの存在と可視性。また、宣言されたタイプとは異なるタイプがプロパティ に割り当てられているかどうか。 • フォーマット文字列に基づいて、 sprintf / printf呼び出しに渡されるパラメーターの数。 • ブランチとループのスコープの中に変数が存在するかどうか。 • (string) 'foo'のような無意味なキャストと、異なる型を厳密に比較していて常に falseになるオペ ランド。 15
PHPDoc 16 ただのコメントじゃないよ
Bengo4.com, Inc. PHPDoc 17 • コードの見通しが良くなる • IDEの補完が効くようになる • 静的解析ができる
levelや範囲などの設定 18 いろいろ柔軟に設定できるよ
Bengo4.com, Inc. Levelや範囲などの設定 19 • includes ◦ 設定ファイルの読み込み • paths
◦ 対象ファイル • level ◦ 静的解析のレベル • excludePaths ◦ 無視ファイル • checkMissingIterableValu eType ◦ 厳密な配列のチェック
CI/CD 20 いろいろ柔軟に設定できるよ
Bengo4.com, Inc. CI/CD もちろんCI/CDを実行する際にも静的解析を走らせることができます push時やcommit時など自由に設定が可能です CI/CDに静的解析を組み入れることでプルリク時のコードレビューに、 凡ミス(変数の未定義や型の違い)を指摘する必要がなくなり、結果的に使用や実装だけにフォーカス したレビューが行えます 21
Larastan 22
Bengo4.com, Inc. Larastan PHPStanライブラリの拡張ラッパーライブラリです LaravelにPHPStanを導入しようとすればファサード周りのエラー(ファサードは実在するクラスではな いため) その他にもEloquentを使う際の where() や find()
にも同様のエラーが起きます LarastanではそういったLaravel独自の仕様をフォローして扱える様にしています 23
使い方とか 24
Bengo4.com, Inc. Composerで Installするだけ 25
Bengo4.com, Inc. あとはPHPStanの様に 扱えるよ 26 ./vendor/bin/phpstan analyze と実行するだけで手動で静的解析が 走ります。 もちろんPHPStan同様にCI/CDで
commit時などに自動で走らせると いった事もできます
ご清聴ありがとう ございました。 27