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
型があると嬉しい〜って本当??
Search
hideki kinjyo
PRO
July 31, 2023
Programming
0
330
型があると嬉しい〜って本当??
hideki kinjyo
PRO
July 31, 2023
Tweet
Share
More Decks by hideki kinjyo
See All by hideki kinjyo
単体テストを書かない技術 #phpcon_odawara
o0h
PRO
27
8.5k
パンフ記事 「初めてのリファクタリング!」 の裏側 #phperkaigi
o0h
PRO
2
79
phpunit/php-code-coverageって何をしてるんだ #phperkaigi
o0h
PRO
2
420
Composerを便利に使うために私がやっていること #phperkaigi
o0h
PRO
1
1.2k
OpCode目線で眺める PHPコードのカバレッジ
o0h
PRO
3
540
アプリケーションエンジニアこそ「監視」だよね!と私が考える訳 #phpkansai
o0h
PRO
21
9.3k
#phpcondo 新しくEMやってみる人にオススメしたい本を5分で25冊紹介する
o0h
PRO
24
7.7k
PHPのファイルに差分があるかを(astを使って)調べる君
o0h
PRO
0
520
#phpcon 良いコードを書けるようになるコツは「エラーを気にする」 〜プログラマにとってエラーとは何なのか〜
o0h
PRO
0
820
Other Decks in Programming
See All in Programming
CDKコントリビュートの最初の壁を越えよう! -簡単issueの見つけ方-
badmintoncryer
3
170
StoreKit2によるiOSのアプリ内課金のリニューアル
kangnux
0
120
Build Apps for iOS, Android & Desktop in 100% Kotlin With Compose Multiplatform (mDevCamp 2024)
zsmb
0
420
Ruby GitHub Packages
bkuhlmann
0
630
Elm Form Validation
bkuhlmann
0
510
雑に思考を整理する技術と効能
konifar
61
30k
Git Rebase
bkuhlmann
11
1.6k
GraphQLサーバの構成要素を整理する #ハッカー鮨 #tsukijigraphql / graphql server technology selection
izumin5210
4
890
デフォルトにして至高、RubyMineの大好きな所
ruzia
0
650
障害対応を起点としたもっといい開発と運用のサイクル作りのためにできること / Hatena Enginner Seminar #29
polamjag
0
320
Micro Frontends for Java Microservices - Utah JUG 2024
mraible
PRO
1
100
サイコロで理解する統計的仮説検定の考え方
tatamiya
4
1k
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
22
1.6k
Embracing the Ebb and Flow
colly
80
4.2k
Designing with Data
zakiwarfel
96
4.8k
Git: the NoSQL Database
bkeepers
PRO
423
63k
Building Effective Engineering Teams - LeadDev
addyosmani
31
1.9k
Building Your Own Lightsaber
phodgson
100
5.7k
How GitHub Uses GitHub to Build GitHub
holman
468
290k
Learning to Love Humans: Emotional Interface Design
aarron
267
39k
A better future with KSS
kneath
231
16k
Happy Clients
brianwarren
92
6.4k
Optimizing for Happiness
mojombo
370
69k
Unsuck your backbone
ammeep
663
57k
Transcript
が ͳʹ͔ͷษڧձͱ͔͕͋Δ༁Ͱͳ͍ Hideki Kinjyo GitHub: o0h / Twitter: @o0h_
ࣗݾհ / GitHub: @o0h / Twitter: @o0h_ FW CakePHP
Πϯτϩ PHP PHP
( ) https://fortee.jp/phpcon-2021/proposal/6cd22f6c-9caa-432f-930c-9e62f512d59d
None
https://www.php.net/manual/ja/language.types.intro.php
https://www.php.net/manual/ja/language.types.intro.php PHP ( ) PHP
https://www.php.net/manual/ja/language.types.intro.php 10000 3
https://www.php.net/manual/ja/language.types.intro.php =
https://www.php.net/manual/ja/language.types.intro.php ( ) Web
shin1x1͞Μͷൃදʮ੍ͷྗʯ https://speakerdeck.com/shin1x1/restricting-states
shin1x1͞Μͷൃදʮ੍ͷྗʯ https://speakerdeck.com/shin1x1/restricting-states
shin1x1͞Μͷൃදʮ੍ͷྗʯ https://speakerdeck.com/shin1x1/restricting-states
shin1x1͞Μͷൃදʮ੍ͷྗʯ https://speakerdeck.com/shin1x1/restricting-states
t-wada͞Μͷൃදʮ༧ʹউΔޚͳ͠ʯ https://speakerdeck.com/twada/growing-reliable-code-phperkaigi-2022
t-wada͞Μͷൃදʮ༧ʹউΔޚͳ͠ʯ https://speakerdeck.com/twada/growing-reliable-code-phperkaigi-2022
ܕΛ͚ͭΔͧʂʂͷϞνϕʔγϣϯ ( )
:
PHPͷܕએݴ PHP php.net https://www.php.net/manual/ja/language.types.declarations.php
( )
int $l, $r int int NULL DB (= )
int int int int ( )
PHP7 ( ) ࢀߟ ݫີͳܕ͚ IUUQTXXXQIQOFUNBOVBMKBMBOHVBHFUZQFTEFDMBSBUJPOTQIQMBOHVBHFUZQFTEFDMBSBUJPOTTUSJDU
خ͍͠Ͱ͔͢ʁ int t-wada
خ͍͠Ͱ͔͢ʁ = (DB HTTP ) etc ( ) = int
=>
int / $response->getBody() $body- >eof() string, bool, Response, Stream
ࢀߟ IUUQTHJUIVCDPNTMJNQIQ4MJNCMPC4MJN 3FTQPOTF&NJUUFSQIQ
Interface ࢀߟ IUUQTHJUIVCDPNTMJNQIQ4MJNCMPC4MJN 3FTQPOTF&NJUUFSQIQ StreamInterface bool int: 0
(Content-Length ) int int string bool
ܕͱͷ͖߹͍ํ ( ) Interface strict_types=1 private public
:
ΨϯΨϯܕએݴΛ͢Δ͜ͱͷऑͱ͔ PHPDoc PHP PHP
੩తղੳπʔϧΛ͓͏ / PHPStan https://phpstan.org/ PHPStan scans your whole codebase and
looks for both obvious & tricky bugs. Even in those rarely executed if statements that certainly aren't covered by tests. ( )
੩తղੳπʔϧΛ͓͏ / Psalm https://psalm.dev/ Psalm is a static analysis tool
that attempts to dig into your program and fi nd as many type-related bugs as possible. PHPStan
੩తղੳπʔϧΛ͓͏ / PhpStorm PHP PHPStan Psalm lint ( )
PHPStan
= CI ࢀߟ IUUQTQIQTUBOPSHSGDGBDGCDCEGC
PHPDoc @param / @return ࢀߟ IUUQTQIQTUBOPSHSGFFECEEEDG
: `key-of- <***>` `value-of-<***>` ( ) ࢀߟ IUUQTQIQTUBOPSHSCDGDFCBCCBBEE
: int<min, max> `int` ࢀߟ IUUQTQIQTUBOPSHSEFFGDDCCBEEFE
: (key, value ) iterable array mixed ࢀߟ
IUUQTQIQTUBOPSHSEG ff EDFBBBFD
: DTO ࢀߟ IUUQTQIQTUBOPSHSDCFGGCGGGFE
৭ʑͳܕͷදݱ : https://phpstan.org/writing-php- code/phpdoc-types
PHPStan
Πϯετʔϧ͢Δ
ઃఆϑΝΠϧΛઃஔ͢Δ https://phpstan.org/con fi g-reference
࣮ߦ͢Δ
( OK)
ಋೖ࣌ʹ͓֮͑ͯ͘ͱྑͦ͞͏ͳ֓೦ Error Rule/RuleSet Rule RuleSet Rule Rule level PHPStan Ruleset
0 9(max) level
Rule Levelͷྫ https://github.com/phpstan/phpstan-src/blob/1.10.25/conf/con fi g.level6.neon
ಋೖ࣌ʹ͓֮͑ͯ͘ͱྑͦ͞͏ͳ֓೦ Baseline ( ) Error `phpstan analyze generate-baseline` Error ignoreErrors
con fi g 1 ( )Error Baseline ignoreErrors
Baselineͷྫ(CakePHP) https://github.com/cakephp/cakephp/blob/4.4.15/phpstan-baseline.neon
PHPStanͷ͍͞͠ಋೖʹ͚ͯ PJ Level OK Baseline PHPStan ignoreErrors( Baseline ) Error
(cf: https://phpstan.org/user-guide/ignoring-errors#reporting-unused- ignores)
PHPStanͷ͍͞͠ಋೖʹ͚ͯ PJ Level CI 5 6
PHPStanͷ͍͞͠ಋೖʹ͚ͯ 連 Error etc
ͬͱڧྗͳ׆༻ʹ͚ͯ PHPStan https://phpstan.org/writing-php-code/phpdoc-types https://phpstan.org/con fi g-reference https://phpstan.org/user-guide/extension-library OSS
ͱͯࢀߟʹͳΔࢿྉͨͪ PHPStan #phpcon_okinawa pixivFANBOX https://tadsan.fanbox.cc/posts/4348669 #phpcon_okinawa pixivFANBOX https://tadsan.fanbox.cc/posts/2558149
level=0 PHPStan(Larastan) - Shin x Blog https://blog.shin1x1.com/entry/getting-stated-with-phpstan CI / Great static analysis with CI - Speaker Deck https://speakerdeck.com/oogfranz/great-static-analysis-with-ci