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.7k
パンフ記事 「初めてのリファクタリング!」 の裏側 #phperkaigi
o0h
PRO
2
84
phpunit/php-code-coverageって何をしてるんだ #phperkaigi
o0h
PRO
2
470
Composerを便利に使うために私がやっていること #phperkaigi
o0h
PRO
1
1.3k
OpCode目線で眺める PHPコードのカバレッジ
o0h
PRO
3
590
アプリケーションエンジニアこそ「監視」だよね!と私が考える訳 #phpkansai
o0h
PRO
21
9.3k
#phpcondo 新しくEMやってみる人にオススメしたい本を5分で25冊紹介する
o0h
PRO
25
7.9k
PHPのファイルに差分があるかを(astを使って)調べる君
o0h
PRO
0
530
#phpcon 良いコードを書けるようになるコツは「エラーを気にする」 〜プログラマにとってエラーとは何なのか〜
o0h
PRO
0
840
Other Decks in Programming
See All in Programming
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
1
130
“Seeing Like a Programmer”—Resiliency, Limits, and Moral Hazards in Software Engineering (LambdaConf 2024)
chriskrycho
0
440
株式会社ゼネテック
genetec
0
130
PHPコードの実行モデルを理解する / Understanding-the-PHP-Execution-Model
shin1x1
0
1.1k
戦略的DDDは重いのか? / Is strategic DDD heavy?
pictiny
3
2.2k
Ruby on Fails - effective error handling with Rails conventions
talyssonoc
0
300
The Cutting Edge Of Versioning (LambdaConf 2024)
chriskrycho
0
260
TypeScriptとGraphQLで実現する 型安全なAPI実装 / TSKaigi 2024
hokaccha
5
2.9k
The Final Frontier of Web Development: React Server Components vs Jakarta EE
ivargrimstad
0
200
酒飲んでたらテックリードになった話
spbaya0141
0
210
RuboCop: LSP and Prism
koic
1
110
FoodGram
iseruuuuu
0
230
Featured
See All Featured
Fireside Chat
paigeccino
22
2.7k
Intergalactic Javascript Robots from Outer Space
tanoku
266
26k
RailsConf 2023
tenderlove
9
590
What the flash - Photography Introduction
edds
64
11k
In The Pink: A Labor of Love
frogandcode
138
21k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
15
1.6k
GraphQLとの向き合い方2022年版
quramy
33
13k
How to name files
jennybc
65
94k
Gamification - CAS2011
davidbonilla
77
4.6k
Building Applications with DynamoDB
mza
88
5.7k
The Invisible Customer
myddelton
114
12k
Designing for humans not robots
tammielis
247
25k
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