Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
現代的 PHP アプリの作り方 / How to build a modern PHP app...
Search
kubo-sr
July 05, 2024
44
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
現代的 PHP アプリの作り方 / How to build a modern PHP application
kubo-sr
July 05, 2024
More Decks by kubo-sr
See All by kubo-sr
ターミナルと仲良くなろう / Let's get to know the terminal.
kubosr
0
25
サービスを継続させるために / What we can do to keep the service going
kubosr
0
51
Featured
See All Featured
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
490
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Test your architecture with Archunit
thirion
2
2.4k
Navigating Team Friction
lara
192
16k
My Coaching Mixtape
mlcsv
0
360
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Practical Orchestrator
shlominoach
192
12k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
570
Google's AI Overviews - The New Search
badams
0
1.6k
Transcript
ݱత PHP ΞϓϦͷ࡞Γํ ݪ: PHPϓϩάϥϛϯάॳڃߨ࠲
ఆಡऀ • ͍ΘΏΔδϡχΞΫϥε • ۀʹ͓͚Δϓϩάϥϛϯάܦݧ: ~ 1 • جຊͱͳΔݴޠ༷ɾจ๏Λ͓͍͑ͯ͞Δঢ়ଶ
2
Q. ͦΕͧΕͷFWͷಛ 3
બఆํ๏ • framework λά͖ͭ (Packagist) • μϯϩʔυ 1,000 ສճҎ্ (Packagist)
• ۙϦϦʔε͕ࠓ 4
#1 Laravel (laravel/laravel) • μϯϩʔυ͕ଟ͍ • ݱత PHP WAF ͱͯ͠࠷༗໊͔
• ༗ࢤʹΑͬͯܧଓతʹυΩϡϝϯτ͕༁͞Ε͍ͯΔ • ͓ੈʹͳ͍ͬͯΔํͥͻد͠·͠ΐ͏ • ΤίγεςϜؔ࿈ϓϩμΫτ͕๛Ͱ͙͢ʹ͑Δ • Laravel Octane ͳͲ 5
#2 Symfony (symfony/symfony-bundle) • ͪ͜Βμϯϩʔυ͕ଟ͍ • LTS (ظαϙʔτ) ͕͋Δ •
ػೳ͝ͱʹίϯϙʔωϯτͱׂͯ͠͞Ε͍ͯΔ • WAF ͱͯ͠ͷ Symfony ͜ΕΛΈ߹Θͤͨͷ • Laravel ͳͲ͍ͬͯΔ (symfony/http-foundation ͳͲ) ͷͰ࣮͍ΖΜͳॴʹ͍Δ • ڧྗͳެࣜϓϩϑΝΠϥʔ (symfony/pro fi ler-pack) ͕͋Δ • ຊͰ࠾༻ྫΛ͋·ΓΈͳ͍ 6
#3 Laminas (laminas/laminas-mvc) • ex. Zend Framework • ΤϯλʔϓϥΠζ (େن)
Ͱͷ࠾༻ྫ͕ଟ͍ (Β͍͠) • ͪ͜Βίϯϙʔωϯτͱͯ͠ϞδϡʔϧԽ͞Ε͍ͯΔ༷ࢠ 7
#4 Slim (slim/slim) • ʮϚΠΫϩ ϑϨʔϜϫʔΫʯ • WAF ͱͯ͠࠷খݶͷػೳηοτ •
ϝϞϦ༻ྔ͕গͳ͍͔ • ۙࠒ Laravel Symfony খ͞ͳηοτ͔Β࢝ΊΒΕΔͷͰ… 8
#5 WordPress • WordPress ࣗମ Packagist ʹͳ͍ • roots/wordpress (ඇެࣜ)
• ੈքʹ͋ΔΣϒαΠτͷ 43.3% WordPress ͱ͞Ε͍ͯΔ • ࠓ WordPress όʔδϣϯཧͰ͖·͢ • ཧ༝͕ͳ͚Ε߹Θͤͯ timber/timber roots/sage Λ͓͏ 9
#6 Guzzle (guzzlehttp/guzzle) • PHP ϓϩηε͔Β֎෦ HTTP ௨৴Λߦ͏ϥΠϒϥϦ (ΫϥΠΞϯ τ)
• ͪ͜ΒΛ͑Ε ext-curl Λ͏ཧ༝ͳ͍ (ͣ) 10
#7 Pest (pestphp/pest) • ࠷ۙྲྀߦ͍ͬͯΔΒ͍͠ςετ༻ϑϨʔϜϫʔΫ • ϓϩϑΝΠϥʔ Architectual Testing ͳͲ͕Έࠐ·Ε͍ͯͯҙ
ཉత • ϑϨʔϜϫʔΫͱͷ౷߹αϙʔτ Laravel ͘Β͍͔͠ͳͦ͞͏ 11
໔ • PHP Ͱ͋Ε Web Application Framework Laravel ·ͨ
Symfony ͷͲͪΒ͔Λ͍ͬͯ·͢ • ଞͷಛᐆດͰ͢ 12
Q. ࣮Ͱଟ͘ΘΕ͍ͯΔFWʁ 13
A. Laravel • OSS Ͱͪ͜Β͔͠ݟͨ͜ͱ͕ͳ͍ (ݸਓͷײͰ͢) • ྑ͘ѱ͘ easy دΓͰ࢝Ί͍͢
(ݸਓͷײͰ͢) • ຊޠͰ͋ͬͯௐΕͳʹ͔͠ΒΈ͔ͭΔ 14
Q. ॳֶऀʹ͓͢͢ΊͷFWʁ 15
A. తʹΑͬͯҟͳΔ 16
ݸਓతʹͳʹ͔࡞Γ͍ͨͳΒ • 👉 Laravel • ʮશ෦ೖΓʯʮͦͷ··͑ΔʯͳͲ࢝Ί͍͢ • ެࣜυΩϡϝϯτ͕ൺֱతಡΈ͍͢ɾ୳͍͢͠ • ྑ͘ѱ͘ͱʹ͔͘ใ͕Έ͔ͭΔ
(ຊޠऀ҆৺) 17
ڭࡐͱ͍ͨ͠ • 👉 Symfony • ࣮ಡΈ͘͢࡞Γ͕ྑ͍ (Ұ෦ྫ֎͋Γ) • ίϯϙʔωϯτ͝ͱʹ࡞ΒΕ͍ͯΔͷͰಡΉൣғΛڱ͘Ͱ͖Δ •
ج൫ͱͯ͠ΘΕ͍ͯΔͷ͋ΔͷͰ͓ͬͯ͘ͱ߹͕ྑ͍ 18
͓ࣄͰ͏ • 👉 ؔऀશһͰܾΊΑ͏ • ϓϩδΣΫτ (ϓϩμΫτ) ͝ͱʹతมΘΔ • ҰൠతͳࢦඪΛڍ͛Δͱ…
• νʔϜʹৄ͍͠ਓ͕͍Δ • νʔϜͰ͍ͬͯΔਓ͕ଟ͍ • ։ൃ͕ଓ͘ݟࠐΈ͕ߴ͍ (·ͨࣗͰଓ͚Δ֮ޛ͕͋Δ) 19
͓͢͢Ίͱ͍͏͕ • ࠓͲ͖ͷ WAF ͍ͣΕҰൠతʹඞཁͱͳΔػೳΛ͍࣋ͬͯΔ • త͕ҧ͏ • ͓ࣄͰͦͦબͳ͍͜ͱ͕ଟ͍ •
ݩ͚ʹΑΔཁ݅ • Ϧʔμʔ͕͢ͰʹܾΊ͍ͯΔ • ։ൃதʹ్தࢀՃ • ͔ͭͯ࡞ΒΕͨγεςϜ… 20
Q. PHPϓϩάϥϛϯάͷίπ 21
A. ࠓͲ͖ͷ͍ํΛΖ͏ 22
PHP צॴʁ • PHP ࣗମ (ଞͱൺͯ) ݴޠ༷͕ૉͳͷͰ໎͍Ͳ͜Ζ͕গͳ͍ • PHP ࣗମ͕͕Μ͍ͬͯΔͷͰ͕ΜΔඞཁੑ͕গͳ͍
• JIT Compiler (8.0, 8.4) • Copy on Write (ग़ࣗෆ໌) 23
ͰԿΛॏࢹ͖͔͢ • αʔόʔ αΠυ ΞϓϦέʔγϣϯ։ൃظؒΑΓӡ༻ظؒͷ΄͏͕ ͘ͳΓ͕ͪ • ॳظ։ൃͯ͘ 2, 3
• ػೳ։ൃɾӡ༻͚Ε 10 Ҏ্… • 👉 ࡞Γ͢͞ΑΓอक͢͠͞ͷ΄͏͕େࣄͰʁ 24
อक͍͢͠ͱ • ԿΛ͍ͯ͠Δ͔Θ͔Δ • Өڹൣғ͕Θ͔Δ 25
"͜ͷॲཧԿΛ͍ͯ͠Δͷ͔" • Θ͔Γ͢͞ϓϩάϥϛϯάݴޠॲཧܥΑΓઃܭ͕Өڹ͢Δ • ॲཧ͕దʹׂ͞Ε͍ͯΔ͔… • มߋ͕ଞͷ෦ʹӨڹΛ༩͑ͳ͍͔… • ͓ޓ͍ʹґଘ͍͋ͬͯ͠ͳ͍͔… •
͜ͷΑ͏ͳཁૉॲཧ (είʔϓ) ͕͍΄ͲΘ͔Γ͘͢ͳΔ 26
PHP: The Right Way 27
PHP: The Right Way ΛಡΉ • ͍͍ͩͨॻ͍ͯ͋Δ • ࢴ໘ ͱΔؾ
ͷ߹͔Βಛʹ͓΅͑ͯ΄͍͜͠ͱΛൈਮ͢Δ 28
PHP Standards Recommendations 29
PHP Standards Recommendations (PSR) • PHP ༗ࣝऀ͕ू·Γٞͯ͠࡞ΒΕͨඪ४קࠂ • ैΘͶͳΒͳ͍Θ͚Ͱͳ͍ •
ϓϩδΣΫτνʔϜ͝ͱʹै͏͖ϧʔϧΛ͖ٞ͢ • ͔͠͠ PSR ʹै֤͑πʔϧͷඪ४ϧʔϧΛͦͷ··͑Δ • ϑΥʔϚολʔͳͲ 30
PSR-4: Autoloader • ໊લۭؒΛͱʹ PHP ΫϥεΛಡΈࠐΉͨΊͷϧʔϧ (༷) • جຊ PHP
ΫϥεΛॻ͘ • DI (ޙड़) ʹ߹͕ྑ͍ͷͰεΫϦϓτؔ͋·ΓΘͳ͍ • ࡉ͔͚ͯ͘Α͍ • ౷߹؆୯ׂ͕ͩେม 31
ύοέʔδཧ 32
ύοέʔδཧ • PHP ͷΈࠐΈ͚ؔͩ͏ਓ΄ͱΜͲ͍ͳ͍ (ͣ) • ୭͔͕࡞ͬͨϥΠϒϥϦΛ͏ͱ͖ύοέʔδཧπʔϧΛ͏ • PHP Ͱ
Composer ͕σϑΝΫτ ελϯμʔυ • PHP ֦ுϞδϡʔϧͷґଘએݴͰ͖Δ • PSR-4 ʹै͓͚ͬͯϥΠϒϥϦΛউखʹಡΈࠐΜͰ͘ΕΔ (Autoloading) • ৄࡉࢴ໘ͱͯ͘͠ͳΔͷͰׂѪ 33
ଞͷϥΠϒϥϦΛ͍͍ͨͷ͕ͩ • ࠓͲ͖ͷ WAF ґଘ͢ΔϥΠϒϥϦΛએݴ͢Εউखʹͯ͘͠Ε Δ 34
Dependency Injection (DI) use Psr\Log\LoggerInterface; class ListBlogArticlesService { // ίϯετϥΫλʔͷܕએݴͰ
LoggerInterface ͕΄͍͠ͱએݴ͢Δ // Laravel Symfony Λ͍ͬͯΕ Monolog\Logger ͳͲΛউखʹ༻ҙͯͯ͘͠͠ΕΔ // ࠷ॳ͍͜͠ͱߟ͑ͳͯ͘Α͍ function __construct(private readonly LoggerInterface $logger) {} public function listArticles(): array { $this->logger->info("I've loaded the list of articles :)"); } } 35
ܕએݴ 36
ܕએݴ • PHP ಈతܕ͚Λߦ͏͕ҾɾΓͷσʔλܕΛ໌ࣔͰ͖Δ • ࢦఆ͕ͳ͚Ε mixedɺͳΜͰड͚ೖΕΔ • TypeScript ͷ
any unknown ͱಉ͡ • ຊʹ͘͝كʹʮͨͩͷද໌ͳͷʹએݴͱݺͿͷ͓͔͍͠ʯͱݴΘ ΕΔ͕ެ͕ࣜʮܕએݴʯͱݺΜͰ͍Δ 37
ྫ: ܕએݴ // ม $name จࣈྻΛऔΓɺΛฦ͞ͳ͍͜ͱΛ͍ࣔͯ͠Δ // ͔͠͠ PHP ॲཧத
(࣮ߦ࣌) ʹจࣈྻ͕͞Εͳ͚ΕΤϥʔͱ͢Δ͚ͩ // ͕ΜΕ֎෦πʔϧΛͬͯڧ੍Ͱ͖Δ͕… function greetings(string $name): void { echo 'Hello, ' . $name . '.'; } // ͜ͷͨΊʹΖ͏ͱࢥ͑จࣈྻҎ֎Λ͢͜ͱͰ͖Δ // (Τϥʔ͕ग़ΔͷͰҙຯͳ͍) // ͜͜Ͱจࣈྻ (string) Ͱͳ͘ (int) Λ͍ͯ͠Δ greetings(42); 38
Strict Ϟʔυ 39
Strict Ϟʔυ • PHP طఆͰσʔλͷܕ͕ҧ͑߹ΘͤΑ͏ͱ͢Δ • "ͨͱ͑ɺؔʹ int ͕༩͑ΒΕ͕ͨɺ ύϥϝʔλͰจࣈྻ͕ظ
͞Ε͍ͯͨ߹ɺจࣈྻܕͷΛऔಘ͠·͢ɻ" • Strict ϞʔυͰ͜ͷڍಈΛࢭΊΒΕΔ • σʔλܕΛಛఆ͢Δͱߟ͑Δ͜ͱ͕ݮΔ 40
null ڐ༰ 41
null ڐ༰ • PHP ܕએݴʹ Union types Λهड़Ͱ͖Δ • ݴޠϨϕϧͰ
nullable ͱ non-nullable Λ۠ผͰ͖Δ • PHP 8.4 Ͱ͜ͷنଇ͕ڧ͘ͳΔ 42
Nullable type // ԾҾ string ͔ int ͔ null ͔…
function greetings($name): void { // Λݕࠪͯ͠ྫ֎Λ throw ͢Δ͔Ωϟετ͠ͳ͚Ε } // จࣈྻҎ֎͞ΕΔ͜ͱͳ͍ɺnull ݕࠪෆཁ function typedGreetings(string $name): void { // whatever } // จࣈྻ·ͨ null Λ͞ΕΔɺॻ͖ํ 2 ௨Γ͋Δ (ޙऀͷ΄͏͕༏͔) // Α͍ࠞͥ͜ͳ͍Α͏ʹ function typedGreetingsWithNull(string|null $firstName, ?string $lastName): void { // ... } 43
=== (!==) ԋࢉࢠ 44
ݫີͳՁԋࢉࢠ • PHP Ձԋࢉࢠ͕ 2 छྨ͋Δ (==, ===) • Ұൠతͳ
`==` ൺֱલʹܕͷ૬ޓม (ࣗಈม) ͕ೖΔ • ʹΑͬͯڍಈ͕มΘΓಘΔͷͰ `===` Λ͓͏ 45
ྫ > "2E1" == "020" = true 46
PHPDoc 47
PHPDoc ͱ • ΫϥεؔͳͲʹ༩͞ΕΔίϝϯτͷ͏ͪಛఆͷܗࣜͰ͋Δͷ • ϑΥʔϚοτͳͲ͕ܾ·͍ͬͯΔ • ରͷΛઆ໌͢ΔͳͲ͍͔ͭ͘༻్͕͋Δ • PHP
ίʔυʹӨڹͳ͘σʔλܕΛද໌Ͱ͖Δ • PHP ͰͰ͖ͳ͍͜ͱͰ͖Δ (Array shapes, Generics, ...) 48
ྫ /** * Λ;ͨͭड͚औΓɺͦΕΒΛؚΉྻΛྻͱͯ͠ฦ͠·͢ɻ * * @param int $min Լݶ
* @param int $max ্ݶ * @return array<int> $min ͔Β $max ·Ͱ࿈ଓ͢Δ */ function range($left, $right) { $range = []; for ($i = $min; $i < $max;) { $range[] = ++$i; } return $range; } 49
assert() 50
assert() • PHP ͷΈࠐΈؔ • ҾʹࣜΛࢦఆ͠ɺ͜Εِ͕ͱͳΔ߹ྫ֎Λ throw ͢Δ • ຊ൪ڥͰ࣮ߦ͠ͳ͍Α͏ઃఆͰ͖Δ
(σϑΥϧτແޮ) • ͜ΕʹΑΓ Validation ͱͳΒͳ͍ͷͰҙ • ݺͼग़͠ݩͷաͪΛΒͤΔͨΊʹ͏ 51
ॲཧΛׂ͢Δ 52
ॲཧΛ͚Δ • PHP ͷ֎ͱ௨৴͢Δͱ͖ॲཧΛ͚Α͏ • ࣗҎ֎͕ग़ͯ͘Δͱෆ۩߹͕૿͕͑ͪ • ͜ͷεςοϓ͕Ͱ͖ͨΒؔ৺ࣄʹΑͬͯॲཧΛ͚Α͏ • ؔ
(ϝιου) Λׂ͢Δ͚ͩͰޮՌత • ಡΉൣғ (είʔϓ) ͍΄͏͕Α͍ • ཧ۶ͱ֤ͯ͠ॲཧ͕͘ͳΔͱෳࡶ͕͞Լ͕Γ͍͢ • Cognitive Complexity, Cyclomatic Complexity... • : ͜ͷͩ͘Γ PHP ؔͳ͍ 53
ॲཧΛ͚Δ • ׂΑΓ౷߹͢Δ΄͏͕؆୯ • ͍ࣺͯΔͭΓͰ࡞ͬͨϓϩάϥϜ΄Ͳ͘ΘΕ͕ͪ (ݸਓͷײ Ͱ͢) • ͦΕΛ͍ଓ͚ͨ͘ͳ͍ಈػ൴Βʹ… •
ϝιουɾ͚ؔͩͰ͚͓ͯ͘ͱޙͰͳΜͱ͔͍͢͠ 54
ྫ 1 function retrieve_articles(): array { return $this->repository->getArticles(); } function
readable(Article $article): bool { return $article->getPublishedAt() <= (new \DateTime()); } function to_result(Article $article): array { return [ 'author' => $article->getAuthor(), 'content' => $article->getContent(), 'publishedAt' => $article->getPublishedAt(), ]; } function list_articles(): Response { return new Response(array_map( 'to_result', array_filter(retrieve_articles(), 'readable'), )); } 55
ྫ 2 function show(Article $article): array { // ... if
($user->isAdmin()) { return extract_all_properties_from_article($article); } else if ($user === $article->getAuthor()) { return extract_safe_properties_from_article($article); } else { throw new UnauthorizedException(); } } function extract_all_properties_from_article(Article $article): array { return $article->toArray(); } function extract_safe_properties_from_article(Article $article): array { return array_diff_key($article->toArray(), []); } 56
ׂ͢Δͱ • ྫࢴ໘ͷ߹͔ΒՄಡੑΛߟྀ͍ͯ͠ͳ͍ • ॲཧΛׂ͠ DI ͱ߹ΘͤΔͱॲཧΛࠩ͠ସ͑ΒΕΔ • هࣄΛσʔλϕʔε͔ΒऔΔͷͰͳ͘ݻఆΛฦ͢ͳͲ •
👉 ςετ͘͢͠ͳΔʂ • "ςετ༰қઃܭΛͰ͖Δ։ൃऀرগ" 57
PHP: ͜ΕΊ͓͚ͯ 58
ϚδοΫϝιου 59
ϚδοΫϝιου • ࣮͍ͯ͠ΕΦϒδΣΫτΛૢ࡞͢Δͱ͖ݺΕΔಛघͳϝιου • ଘࡏ͠ͳ͍ϝιουϓϩύςΟͷΞΫηεΛ੍ޚͰ͖Δ • ϓϩύςΟϝιουΛՃͨ͠ͱ͖ҙਤ͠ͳ͍ڍಈ͕ى͖ಘΔ • ಁաతͳΦϒδΣΫτΛ࣮͢Δʹ߹͕ྑ͍ •
ྫ: Proxy ύλʔϯ 60
ՄมؔɾՄมϝιου 61
62 ͏ͳ
ՄมؔɾՄมϝιου • มΛͬͯؔɾϝιου໊Λࢦఆ͢Δػೳ • શจݕࡧͳͲͰ͔͠୳ͤͳ͍ • 👉 ࣮Λ୳͠ʹ͍͘ • 👉
࣮ߦ͠ͳ͚Εݺͼग़͠ݩ୳ͮ͠Β͍ 63
ྫ (Illuminate\Bus\Dispatcher) // େͷ߹ $handler->handle() ͷݺͼग़͠ݩҰཡʹ͜ͷॲཧग़ͳ͍ ($handler mixed) //
࣮ߦͯ͠ελοΫτϨʔεΛݟΔ͔͕Μͬͯ୳͔͢͠ͳ͍ $callback = function ($command) use ($handler) { $method = method_exists($handler, 'handle') ? 'handle' : '__invoke'; return $handler->{$method}($command); }; 64
Ҿͱͯ͠ͷ࿈ྻ 65
Ҿͱͯ͠ͷ࿈ྻ • ؔɾϝιουͷҾͱͯ͠࿈ྻΛड͚औΔख๏ • औΓಘΔύϥϝʔλʔΛਖ਼͘͠ఆٛ͢Δํ๏͕ͳ͍ • PHPDoc ͷ֦ு͋Δ (Array shapes)
• ϝϦοτͳ͍ 66
Ҿͱͯ͠ͷ࿈ྻ • ରॲ๏ 1: ҾΛͻͱͭͣͭఆٛ͢Δ • ରॲ๏ 2: ҾΦϒδΣΫτΛఆٛ͢Δ •
ϓϩϞʔγϣϯ (8.0)ɺreadonly (8.1)ɺreadonly class (8.2) ͳͲࢧ ԉ͢Δػೳ͕૿͑ͨ 67
ରॲ๏ 1: ҾΛͦΕͧΕఆٛ͢Δ function search(array $params): bool { // ...
// ྻ͕ظ͢ΔཁૉΛ͍࣋ͬͯΔͱݶΒͳ͍ͷͰஞҰ֬ೝͤͶͳΒͳ͍ // ['containsNumbersOnly'] ʹԿΛͤΑ͍͔Θ͔Βͳ͍ (0|1, true|false, ...) if (array_key_exists('containsNumbersOnly', $params) && $params['containsNumbersOnly']) { $client->query(array_key_exists('needle') && false !== preg_match('\A\d+\z', $params['needle'])); } // ... } function typedSearch(string $needle, bool $containsNumbersOnly): bool { // whatever... } 68
ରॲ๏ 2: Ҿ༻ΦϒδΣΫτΛఆٛ͢Δ readonly class SearchCondition(public string $needle, public bool
$containsNumbersOnly) {} function stronglyTypedSearch(SearchCondition $condition): bool { // whatever... } stronglyTypedSearch(new SearchCondition('Article Title', containsNumbersOnly: true)); 69
εʔύʔάϩʔόϧม 70
εʔύʔάϩʔόϧม • PHP ͕ॳظԽ࣌ʹઃఆ͢ΔͲ͔͜ΒͰΞΫηεͰ͖Δม • HTTP ϦΫΤετʹؔ͢ΔใͳͲΛؚΉͷͰඞཁ͕ͩ͏ඞཁͳ ͍ • symfony/http-kernel,
symfony/http-foundation Λ͓͏ 71
Τϥʔ੍ޚԋࢉࢠ 72
Τϥʔ੍ޚԋࢉࢠ • PHP ࣗʹ͕ى͖ΔͱΤϥʔΛൃੜͤ͞Δ • `Notice: Undefined offset` ͳͲ… •
ࣜͷલʹ `@` Λ͚ͭΔͱ PHP ࣗͷΤϥʔΛҰ෦ແࢹͰ͖Δ • ؔͷΓͳͲʹΑΔΤϥʔදݱͱผʹ PHP Τϥʔ͕ൃੜͬ ͢Δ߹ʹ͏ • ࠷ۙ͏͜ͱͳ͍ 73
goto ԋࢉࢠ 74
goto ԋࢉࢠ • ϓϩάϥϜͷଞͷॴδϟϯϓ͢Δ໋ྩ • ݴΘΕͳ͘ͱΘͳ͍ͱࢥ͏ͷͰׂѪ • ݟͨ͜ͱͳ͍ 75
ඇಉظॲཧ 76
ඇಉظॲཧ • ࠷ۙ·Ͱ PHP ୯ମͰͰ͖ͳ͔ͬͨ (Fibers) • PHP ෦ͰඇಉظॲཧΛ͏͜ͱ͕͋·Γͳ͍ •
PHP HTTP ϦΫΤετ͝ͱʹঢ়ଶ͕Ϧηοτ͞ΕΔͷͰ߹ΘͤΔ ΄͏ָ͕ 77
ฒྻॲཧ 78
ฒྻॲཧ • PHP ϦΫΤετʹର͠γϯάϧϓϩηεɾγϯάϧεϨουͰಈ࡞ ͢Δ • PHP ֦ுϞδϡʔϧ (pthreads) ͕ඞཁͳͷͰ͋·ΓΘͳ͍
(ݸਓͷ ײͰ͢) • ͷճΓͰݟͨ͜ͱͳ͍ 79
·ͱΊ • PSR Λ׆༻͠Α͏ • ܕએݴΛ͓͏ • Strict Ϟʔυʹมߋ͠Α͏ •
֎෦ͱ௨৴͢Δ (৴༻Ͱ͖ͳ͍Λ͏) ॲཧ͚Α͏ • ௨৴͠ͳͯ͘͝ͱʹ͚Α͏ • มɾܭࢉɾ௨৴ͳͲ… • ϥΠϒϥϦ࣮Λड͚͢ॲཧ Web Application Framework ʹ·͔ͤΑ͏ • ࣮ྫެ։Ͱ͖ͳ͍ͷͰͨͣͶ͍ͯͩ͘͞ 80