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に型推論を実装する ~入門編~ / Type inference on PHP
Search
久保田光則
May 21, 2016
Programming
6
9.8k
PHPに型推論を実装する ~入門編~ / Type inference on PHP
PHPカンファレンス福岡2016の資料です。
久保田光則
May 21, 2016
Tweet
Share
More Decks by 久保田光則
See All by 久保田光則
サーバサイドだけでReact使う / React as Template Engine
anatoo
1
730
requestIdleCallback()による協調的バックグラウンド処理の実現 / requestIdleCallback()
anatoo
0
3.7k
Mastodonとその脱中央集権の仕組み
anatoo
11
21k
大量の要素を高速に表示するためのバーチャルレンダリング入門 / Virtual Rendering Introduction
anatoo
8
11k
Cordova開発者が知っておきたいレンダリングエンジンの話 / HTML5 Conference 2015 in Kagoshima
anatoo
4
1.7k
PHPで学ぶVM型正規表現エンジンの仕組み
anatoo
8
7k
チームで作る!イケてるデザイン
anatoo
16
14k
Cordovaで作るHTML5ハイブリッドアプリ 〜開発ベストプラクティスを学ぶ〜
anatoo
27
18k
最新SPA開発を学ぼう! ウェブエンジニアのための AngularJS入門
anatoo
20
20k
Other Decks in Programming
See All in Programming
Go の GC の不得意な部分を克服したい
taiyow
3
930
テストコードのガイドライン 〜作成から運用まで〜
riku929hr
6
1.3k
create_tableをしただけなのに〜囚われのuuid編〜
daisukeshinoku
0
310
KubeCon + CloudNativeCon NA 2024 Overviewat Kubernetes Meetup Tokyo #68 / amsy810_k8sjp68
masayaaoyama
0
270
「Chatwork」Android版アプリを 支える単体テストの現在
okuzawats
0
200
PHPとAPI Platformで作る本格的なWeb APIアプリケーション(入門編) / phpcon 2024 Intro to API Platform
ttskch
0
350
CQRS+ES の力を使って効果を感じる / Feel the effects of using the power of CQRS+ES
seike460
PRO
0
220
KMP와 kotlinx.rpc로 서버와 클라이언트 동기화
kwakeuijin
0
260
開発者とQAの越境で自動テストが増える開発プロセスを実現する
92thunder
1
220
責務を分離するための例外設計 - PHPカンファレンス 2024
kajitack
9
2.2k
return文におけるstd::moveについて
onihusube
1
1.3k
AWSのLambdaで PHPを動かす選択肢
rinchoku
2
340
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
jQuery: Nuts, Bolts and Bling
dougneiner
62
7.6k
Rails Girls Zürich Keynote
gr2m
94
13k
4 Signs Your Business is Dying
shpigford
182
21k
Code Review Best Practice
trishagee
65
17k
Mobile First: as difficult as doing things right
swwweet
222
9k
Faster Mobile Websites
deanohume
305
30k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
171
50k
Speed Design
sergeychernyshev
25
700
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
49
2.2k
Transcript
1)1ʹܕਪΛ࣮͢Δʙೖฤʙ ٱอాޫଇ!BOBUPP
ࣗݾհ w ٱอాޫଇ!BOBUPP w 6*69σβΠφʔ݉ ιϑτΣΞΤϯδχΞ w "TQFDUJWF--$ද w IUUQBTQFDUJWFJP
w "TQFDUJWF--$1)1ΧϯϑΝϨϯεԬʹڠࢍ͍ͯ͠·͢
ධൃചதʂ
IUUQPOTFOJP
ΞδΣϯμ w ܕਪͱ w ͳͥ1)1Ͱܕਪ w ಈతݴޠͰͷܕਪͷϝϦοτ w
1)1ͷ"45ͷଘࡏ w ܕਪΞϧΰϦζϜͷհ
ܕਪͱ
ܕਪ8JLJQFEJB IUUQTKBXJLJQFEJBPSHXJLJ&&#&&"&"# lܕਪʢ͔͍ͨ͢ΖΜʣͱϓϩάϥϛϯάݴ ޠͷػೳͷͭͰɺ੩తͳܕ͚Λ࣋ͭݴޠʹ ͓͍ͯɺมؔͷܕΛએݴ͠ͳͯͦ͘Ε Λಋ͘ͷʹΘΕͨؔͷܕγάωνϟͳͲ͔ ΒࣗಈతʹܕΛܾఆ͢Δػߏͷ͜ͱɻz
ྫ4XJGU w ܕใΛॻ͔ͳͯ͘ܕΛਪͯ͠ίϯύΠϧͯ͘͠ΕΔ w ͋͘·Ͱ੩తܕ͚ͳͷͰpC/VNCFSͷܕ*OU func fib(number: Int) -> Int
{ if number <= 1 { return number } else { return fib(number - 1) + fib(number - 2) } } var fibNumber = fib(8)
ܕਪΛ࣋ͭݴޠ w 4DBMB w )BTLFMM w 0$BNM w 4XJGU w
શͯ੩తܕ͚ͷݴޠ
ಈతܕ͚ݴޠͰ w 1)1ಈతܕ͚ݴޠ w ίϯύΠϧ࣌ʹܕ͕ܾ·Δඞཁͳ͍ w ܕਪΛॻ͘ඞཁͳΜͯͳ͍ͷͰ
w ಈతܕ͚ͷݴޠͰܕਪͷϝϦοτ ͋Δ w ͱ͍͏͔ɺ͢ͰʹΈͳ͞Μ࣮ܕਪͷԸ ܙΛҰ෦त͔͍ͬͯΔ
ಈతݴޠͰͷϝϦοτ w ίϯύΠϧ࣌࠷దԽ w ΤσΟλ*%&Ͱͷิ w ࣄલͷΤϥʔݕ
ίϯύΠϧ࣌࠷దԽ w ಈతݴޠͰɺ࣮ߦ࣌ʹͲͷܕ͕ೖͬͯ ͳ࣮͘ߦͰ͖ΔΑ͏ʹઃܭ͞Ε͍ͯΔ w ͦͷͨΊ࣮ߦ࣌ͷ੩తܕ͚ݴޠʹൺΔ ͱΦʔόʔϔου͕େ͖͍
ྫ1)1ͷ ԋࢉࢠͷॲཧ
IUUQTHJUIVCDPNQIQQIQTSDCMPCNBTUFS;FOE[FOE@PQFSBUPSTD- w ࣮ߦ࣌ʹͲͷܕͷΈ߹Θ͔ͤΛTXJUDIจͰذ
ܕਪΛ͑ w ྫ͑zB CzͷBͱCͷܕ͕ܕਪͰΘ͔Ε ɺίϯύΠϧ࣌ʹͦΕઐ༻ͷߴͳॲཧ ʹࠩ͠ସ͑Δ͜ͱ͕Ͱ͖Δͣ w ֦ுϥΠϒϥϦͰΦϓςΟϚΠβॻ࣌͘ʹ ཱͪͦ͏
+4ͰͷྫIUUQSGSOPSHdTIVESBGUTUJQEG
*%&Ͱͷϝιουͷิ w *%& 1IQ4UPSNͱ͔ Ͱɺ͋ΔมͷΠϯελϯεϝιου ͕ิ͞ΕΔͷɺܕਪ͞Ε͍ͯΔ͔ΒʹଞͳΒͳ͍
Τϥʔݕɾ-JOU w ܕਪͰܕͷໃ६͕ݟ͔ͭΕɺ࣮ߦલʹ ΤϥʔΛग़͢͜ͱ͕Ͱ͖Δ w *%&ΤσΟλͷΤϥʔݕɺ-JOUπʔϧ ͳͲͰԠ༻Ͱ͖Δ
༻్·ͱΊ w ิMJOUπʔϧͳͲɺ։ൃऀΛࢧԉ͢Δ੩ తղੳπʔϧͷ࣮ʹཱͯΒΕΔ w ֦ுϥΠϒϥϦͰ͕ΜΕɺ࠷దԽ͞Ε ͨPQDPEFΛు͘ࣄՄೳ
1)1Ͱͷػӡ
1)1Ͱͷػӡ w 4DBMBS5ZQF)JOUT͕ಋೖ͞Εͨ w ؔͷฦΓͷܕΛࢦఆ͕Մೳʹ w ݫີͳܕνΣοΫͷಋೖ w "45 நߏจ
ͷಋೖ
4DBMBS5ZQF)JOUT w JOUqPBUTUSJOHCPPMͳͲͷεΧϥͷܕ͕5ZQF)JOUͰ ࢦఆͰ͖Δ w ࣗಈతʹΩϟετ͞ΕΔΏΔ͍λΠϓνΣοΫ <?php function square(int $i)
{ return $i * $i; } square(3); // => 9 square(4.1); // => 16
ؔͷΓܕ w ؔͷΓͷܕࢦఆͰ͖ΔΑ͏ʹͳͬ ͨ <?php function foo(): array { return
[1, 2, 3]; } foo();
ݫ֨ͳܕࢦఆ w એݴͨ͠ϑΝΠϧͰܕ͕ݫ֨ʹѻΘΕΔ w ҉ͷΩϟετ͕ߦΘΕͳ͍Ϟʔυʹ <?php declare(strict_types=1); function add(int $a,
int $b): int { return $a + $b; } add(1.0, 2.0); // Τϥʔ
1)1Ͱͷܕͷѻ͍ͷมԽ w ΓͷܕνΣοΫΛએݴͰ͖ΔΑ͏ʹͳͬͨ w ݫີʹએݴͰ͖ΔΑ͏ʹͳͬͨ w ϓϦϛςΟϒͳͷܕ͕ࢦఆͰ͖ΔΑ͏ʹͳͬ ͨ w ੩తղੳ͘͢͠ͳͬͨ
1)1ͷ"45 w ैདྷͰɺ"45ੜͤͣʹ;FOE&OHJOF ༻ͷ໋ྩΛίϯύΠϧ͍ͯͨ͠ w 1)1ͰɺίϯύΠϧ࣌ʹ"45Λੜ͢Δ Α͏ʹͳͬͨ
"45 நߏจ ͱ w ύʔεͨ͠ίʔυͷநతͳπϦʔߏͷσʔλ IUUQTpSFCFBSTUVEJPDPNCMPHIPXUPHFUSFBEZGPSQIQIUNM for ($i = 0;
$i < 4; $i++) { ... }
ࣈ۟ղੳ ߏจղੳίϯύΠϧ ࣮ߦ w 1)1Ͱɺߏจղੳ͠ͳ͕Β7.༻ίʔυΛੜ w CJTPOͷηϚϯςΟοΫΞΫγϣϯͰ݁ τʔΫϯͷϦετΛੜ ύʔεͭͭ͠7.༻ͷ໋ྩΛੜ ෦7.Ͱ࣮ߦ
1)1Ͱͷ࣮ߦͷྲྀΕ
τʔΫϯͷϦετΛੜ நߏจ "45 ͷੜ ෦7.༻ͷ໋ྩΛੜ ෦7.Ͱ࣮ߦ ࣈ۟ղੳ ߏจղੳ ίϯύΠϧ ࣮ߦ
w 1)1Ͱɺߏจղੳ࣌ʹ"45Λੜ w 7.༻ͷίʔυੜͦͷޙʹߦ͏Α͏ʹͳͬͨ 1)1Ͱͷ࣮ߦͷྲྀΕ
1)1"45֦ுϥΠϒϥϦ w ैདྷίϯύΠϧ͕ऴΘΕ"45ࣺͯΒΕΔ w 1)1͔ΒͰநߏจΛѻ͏͜ͱ͕Ͱ͖ ΔΑ͏ʹ͢Δ֦ுϥΠϒϥϦ w நߏจΛऔΓग़ͯ͠੩తղੳͰ͖Δ IUUQTHJUIVCDPNOJLJDQIQBTU
ྫ <?php require 'path/to/util.php'; $code ='<?php $var = 42;’ echo
ast_dump(ast\parse_code( $code, $version=30 )), "\n"; IUUQTHJUIVCDPNOJLJDQIQBTUCMPCNBTUFS3&"%.&NE
ग़ྗ w WBSͱ͍͏ίʔυͷߏจ͕औΕ͍ͯΔ w ͜ΕͰ੩తղੳ͠์ͩʂ AST_STMT_LIST 0: AST_ASSIGN var: AST_VAR
name: "var" expr: 42
ܕਪͷ֓ཁ
ܕਪثͷجຊతͳಈ͖ w ͱ͍͏දݱΛܕਪثʹ༩͑Δ߹ w ܕਪثɺநߏจͷܭࢉએݴΛਫ਼ࠪͯ͠ਪنଇ ΛݩʹܕใΛܭࢉ͍ͯ͘͠
JOUFHFS JOUFHFS JOUFHFS
ޡΓ͕͋Δ߹ w OFX0CKFDU ͱ͍͏ίʔυΛਪثʹ͢߹ w ܕϨϕϧͰޡΓ͕͋Ε࣮ߦલʹΤϥʔΛग़͢ OFX 0CKFDU
&3303 0CKFDU JOUFHFS OFX 0CKFDU
ਪͷϙΠϯτ w &YQSFTTJPOͷߏจͷ͔ΒਪΛ࢝ΊΔ w ਪنଇʹԠͯ͡ਪ͍ͯ͘͠ w Θ͔Βͳ͍߹ʹܕมΛՃ w ੍ݶʹԠͯ͡ϢχϑΟέʔγϣϯΛߦ͏ w
ܕมͷೖɾΤϥʔͷݕ w ਪ͕Ͱ͖ͨ߹ʹܕڥʹө͍ͯ͘͠
͔Βਪ͢Δ w ͋ΔܭࢉΛਪ͢Δ߹ʹɺԼ෦ͷϊʔυ͔Βਪ͍ͯ͘͠ w ߏจΛ࠶ؼతʹḷͬͯߦ͘͜ͱͰՄೳ JOUFHFS
JOUFHFS JOUFHFS JOUFHFS JOUFHFS
ਪنଇʹΑͬͯਪ͍ͯ͘͠ w ྫF ͱF ͷܕ͕JOUͰ͋Δ࣌ɺ F F ͷܕJOUͰ͋Δ w
ྫF ͱF ͷܕ͕BSSBZͰ͋Δ࣌ɺ F F ͷܕBSSBZͰ͋Δ w ྫF ͷܕ͕0CKFDUͱF ͷܕ͕JOUͰ͋Δ࣌ɺλΠϓΤϥʔͰ͋Δ w ߏจΛͨͲ͍ͬͯ࣌͘ʹਪنଇΛద༻ w نଇ۪ʹίʔυΛॻ͍͍ͯ͘ w ܕ͕Θ͔ͬͨΒܕڥʹө͍ͯ͘͠
ܕڥ w ؔΫϥεͳͲͷܕใΛొ͢Δॴ w ΈࠐΈؔͷܕใ༧Ίొ w ίʔυΛղੳͯ͠ਪͰ͖ͨ݁ՌΛ֨ೲ w ܕਪثͷ࣮ߦίϯςΩετΈ͍ͨͳͷ
ܕ͕Θ͔Βͳ͍߹ w Bͷܕ͕Θ͔Βͳ͍ w ܕมΛׂΓͯͯɺஅΛԆͤ͞Δ B JOUFHFS
ܕม w ܕͱͯ͠ѻ͑ΔೖΕɻޙͰதʹ࣮ࡍͷܕΛೖͰ͖Δ w ܕ͕Θ͔Βͳ͍߹ʹܕมΛׂΓͯΔ JOU TUSJOH 'PP
ׂΓͯΔྫ w ྫ͑ؔͷԾҾฦΓʹܕ͕ࢦఆ͞ Ε͍ͯͳ͍߹ <?php function foobar($a, $b) { ...
}
ܕมͷೖ w ϢχϑΟέʔγϣϯΛ௨ͯ͡ೖ͢Δ JOU =
ϢχϑΟέʔγϣϯ ୯ҰԽ w ܕਪதʹํͷೖΛߦ͏ͨΊͷΈ w ࣦഊͨ͠߹ܕϨϕϧͰؒҧ͍͕͋ΔͱΈͳ ͯ͠Τϥʔ w ܕͷ੍ݶ͕͋ΔՕॴͰϢχϑΟέʔγϣϯΛߦ ͏
ϢχϑΟέʔγϣϯܕͷ੍ ݶ͕͔͔ΔՕॴͰ࣮ߦ͢Δ
ԾҾͷܕͱҾͷܕ w OVNͷܕͱBҾͷܕಉ͡Ͱͳ͚ΕͳΒͳ͍ <?php declare(strict_types=1); function square(int $a): int {
... } echo square($num);
SFUVSOͷܕͱฦΓͷܕએݴ w SFUVSOͷදݱͷܕͱฦΓͷܕએݴಉ͡Ͱͳ ͚ΕͳΒͳ͍ <?php declare(strict_types=1); function foobar(): int {
return $num; }
ྫ w Կ͠ͳ͍ɻܕ͕͋ͬͯΔͷͰେৎ function foobar(): int { return 1; }
JOUJOU ޭ
ྫ function foobar(): int { return “hoge”; } JOUTUSJOH Τϥʔ
w ܕ͕͋ͬͯͳ͍ͷͰΤϥʔΛग़͢
ྫ w GPPCBSؔͷฦΓͷܕมBʹJOU͕ೖ͞ΕΔ function foobar() { return 1; } BJOU
BʹJOUΛೖ ฦΓͷܕʹܕมBΛׂΓͯ
ྫ w ͠ܕมʹผͷܕ͕͢Ͱʹೖ͍ͬͯΔ߹ʹ Τϥʔ function foobar(): int { return $globalNum;
} JOUC ܕมCʹJOUΛ࣮ ܕมCΛׂΓͯ
ྫ w ҾͷܕͱฦΓͷܕ͕ಉ͡Ͱ͋Δ͜ͱ͕ਪ Ͱ͖Δ function foobar($a) { return $a; }
ED ܕมDΛܕมEʹׂΓͯΔ ܕมDΛׂΓͯ ฦΓͷܕʹܕมEΛׂΓͯ
ؔద༻ͰਪͰ͖Δྫ w JODؔͷΓͷܕɺؔຊମΛݟ͚ͨͩͰΘ͔Βͳ͍ w ؔద༻ͰҾͷܕݟΔͱॳΊͯ໌͢Δ w ؔద༻ͷࣜΛਪ͢Δͱ͖ʹɺҾͷܕͱJODؔͷத Λਪ͢͜͠ͱͰJOD ͷܕ͕Θ͔Δ
function inc($a) { return $a + 1; }; $n = inc(3);
ͱΓ͋͑ͣҎ্ w ಈతܕ͚ͳͷͰɺਪͰ͖Δͱ͜Ζ͚ͩ ෦తʹਪͯ͠ऴΘΓͰͳ͍ w ੩తܕ͚ͷݴޠͱҧͬͯશʹͯ͢ ܕ͚͠ͳͯ͘ྑ͍ w ϝιουิͳͲͷతͷͨΊʹᘳʹਪ ͠Α͏ͱ͢Ε͢Δ΄Ͳ͘͠ͳΔ
·ͱΊ w 1)1Ͱ"45ͷಋೖͰ੩తղੳ͕͘͢͠ ͳͬͨ w ಈతܕ͚ͰܕਪΛߦ͏ϝϦοτ͋Δ w ࣮ߦલΤϥʔݕ w ίϯύΠϧ࣌࠷దԽ
w ิࢧԉ
·ͱΊ w ܕਪ"45ΛḷͬͯਪنଇΛݩʹਪ͍ͯ͘͠ w ؔϝιουͷܕܕڥʹొ͍ͯ͘͠ w ͦͷͰΘ͔Βͳ͍ܕɺܕมΛׂΓͯΔ w ΤϥʔͷݕܕมͷೖϢχϑΟέʔγϣ ϯΛ༻͍Δ
w ϢχϑΟέʔγϣϯܕͷ੍ݶ͕͋ΔՕॴͰద༻͢ Δ
Γ͍ͨ͜͠ͱ w ΑΓৄࡉͳΞϧΰϦζϜ w ଟ૬ܕ OVMMcJOUFHFS Έ͍ͨͳܕͷѻ͍ w ಈతܕ͚ͷ߹ͷΞϧΰϦζϜͷௐ w
FWBM͕͋Δͱແ͠ͳ w ίϯτϩʔϧϑϩʔΛղੳ͢Δ w ͰෆՄೳ
ը૾ग़యंాਖ਼ඒஉࡔ
None
͝ਗ਼ௌ͋Γ͕ͱ͏ ͍͟͝·ͨ͠