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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
久保田光則
May 21, 2016
Programming
6
10k
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
840
requestIdleCallback()による協調的バックグラウンド処理の実現 / requestIdleCallback()
anatoo
0
4k
Mastodonとその脱中央集権の仕組み
anatoo
11
21k
大量の要素を高速に表示するためのバーチャルレンダリング入門 / Virtual Rendering Introduction
anatoo
8
11k
Cordova開発者が知っておきたいレンダリングエンジンの話 / HTML5 Conference 2015 in Kagoshima
anatoo
4
1.8k
PHPで学ぶVM型正規表現エンジンの仕組み
anatoo
8
7.3k
チームで作る!イケてるデザイン
anatoo
16
14k
Cordovaで作るHTML5ハイブリッドアプリ 〜開発ベストプラクティスを学ぶ〜
anatoo
27
18k
最新SPA開発を学ぼう! ウェブエンジニアのための AngularJS入門
anatoo
20
20k
Other Decks in Programming
See All in Programming
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
920
The Art of Re-Architecture - Droidcon India 2025
siddroid
0
170
CSC307 Lecture 04
javiergs
PRO
0
650
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
250
疑似コードによるプロンプト記述、どのくらい正確に実行される?
kokuyouwind
0
350
Fragmented Architectures
denyspoltorak
0
140
humanlayerのブログから学ぶ、良いCLAUDE.mdの書き方
tsukamoto1783
0
160
CSC307 Lecture 02
javiergs
PRO
1
770
.NET Conf 2025 の興味のあるセッ ションを復習した / dotnet conf 2025 quick recap for backend engineer
tomohisa
0
120
AgentCoreとHuman in the Loop
har1101
5
200
AtCoder Conference 2025
shindannin
0
1k
AIエージェントの設計で注意するべきポイント6選
har1101
7
3.3k
Featured
See All Featured
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
61
52k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.6k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.1k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
300
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.5k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
The Cost Of JavaScript in 2023
addyosmani
55
9.4k
Accessibility Awareness
sabderemane
0
44
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
0
120
The Art of Programming - Codeland 2020
erikaheidi
57
14k
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
͝ਗ਼ௌ͋Γ͕ͱ͏ ͍͟͝·ͨ͠