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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
久保田光則
May 21, 2016
Programming
10k
6
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PHPに型推論を実装する ~入門編~ / Type inference on PHP
PHPカンファレンス福岡2016の資料です。
久保田光則
May 21, 2016
More Decks by 久保田光則
See All by 久保田光則
サーバサイドだけでReact使う / React as Template Engine
anatoo
1
870
requestIdleCallback()による協調的バックグラウンド処理の実現 / requestIdleCallback()
anatoo
0
4.2k
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.4k
チームで作る!イケてるデザイン
anatoo
16
14k
Cordovaで作るHTML5ハイブリッドアプリ 〜開発ベストプラクティスを学ぶ〜
anatoo
27
18k
最新SPA開発を学ぼう! ウェブエンジニアのための AngularJS入門
anatoo
20
20k
Other Decks in Programming
See All in Programming
技術記事、 専門家としてのプログラマ、 言語化
mizchi
14
7.5k
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
320
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
130
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
120
フィードバックで育てるAI開発
kotaminato
1
120
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
320
地域 SRE コミュニティ最前線 - ホンマでっかSRE勉強会
tk3fftk
0
230
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
320
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
0
110
OSINT for SRE: 学術論文とポストモーテムから探る システム障害の共通パターン / SRE NEXT 2026
tomoyk
1
3.6k
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
190
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
320
Featured
See All Featured
Mobile First: as difficult as doing things right
swwweet
225
10k
The agentic SEO stack - context over prompts
schlessera
0
840
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
800
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
490
First, design no harm
axbom
PRO
2
1.2k
Facilitating Awesome Meetings
lara
57
7k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.7k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
How to Think Like a Performance Engineer
csswizardry
28
2.7k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
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
͝ਗ਼ௌ͋Γ͕ͱ͏ ͍͟͝·ͨ͠