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
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
880
requestIdleCallback()による協調的バックグラウンド処理の実現 / requestIdleCallback()
anatoo
0
4.2k
Mastodonとその脱中央集権の仕組み
anatoo
11
22k
大量の要素を高速に表示するためのバーチャルレンダリング入門 / 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
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
160
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
2.8k
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
3.5k
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.7k
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.3k
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
3
760
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
220
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
540
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
150
Built Our Own Background Agent at LayerX
layerx
PRO
9
5k
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
600
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
1
1.5k
Featured
See All Featured
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Embracing the Ebb and Flow
colly
88
5.1k
The Cost Of JavaScript in 2023
addyosmani
55
10k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
330
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
330
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
280
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
460
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
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
͝ਗ਼ௌ͋Γ͕ͱ͏ ͍͟͝·ͨ͠