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.9k
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
750
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
7.1k
チームで作る!イケてるデザイン
anatoo
16
14k
Cordovaで作るHTML5ハイブリッドアプリ 〜開発ベストプラクティスを学ぶ〜
anatoo
27
18k
最新SPA開発を学ぼう! ウェブエンジニアのための AngularJS入門
anatoo
20
20k
Other Decks in Programming
See All in Programming
Bedrock Agentsレスポンス解析によるAgentのOps
licux
2
580
[JAWS-UG横浜 #79] re:Invent 2024 の DB アップデートは Multi-Region!
maroon1st
1
140
『品質』という言葉が嫌いな理由
korimu
0
150
Grafana Cloudとソラカメ
devoc
0
140
Linux && Docker 研修/Linux && Docker training
forrep
23
4.4k
ペアーズでの、Langfuseを中心とした評価ドリブンなリリースサイクルのご紹介
fukubaka0825
2
300
動作確認やテストで漏れがちな観点3選
starfish719
6
1k
個人アプリを2年ぶりにアプデしたから褒めて / I just updated my personal app, praise me!
lovee
0
340
Introduction to kotlinx.rpc
arawn
0
310
Compose でデザインと実装の差異を減らすための取り組み
oidy
1
300
Honoをフロントエンドで使う 3つのやり方
yusukebe
1
420
Writing documentation can be fun with plugin system
okuramasafumi
0
120
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
28
5.5k
Testing 201, or: Great Expectations
jmmastey
41
7.2k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.8k
Bash Introduction
62gerente
610
210k
Code Review Best Practice
trishagee
66
17k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
9
1.3k
GraphQLとの向き合い方2022年版
quramy
44
13k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.3k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.1k
The Cost Of JavaScript in 2023
addyosmani
47
7.3k
[RailsConf 2023] Rails as a piece of cake
palkan
53
5.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
͝ਗ਼ௌ͋Γ͕ͱ͏ ͍͟͝·ͨ͠