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アプリケーション開発
Search
shin1x1
October 08, 2017
Technology
5
11k
型を意識したPHPアプリケーション開発
2017/10/08 PHPカンファレンス2017
https://github.com/shin1x1/phpcon2017
shin1x1
October 08, 2017
Tweet
Share
More Decks by shin1x1
See All by shin1x1
抽象化という思考のツール - 開発現場での活用 - / Abstraction-as-a-Tool-for-Thinking-in-dev
shin1x1
0
85
抽象化という思考のツール - 理解と活用 - / Abstraction-as-a-Tool-for-Thinking
shin1x1
1
1.1k
php-fpm がリクエスト処理する仕組みを追う / Tracing-How-php-fpm-Handles-Requests
shin1x1
6
3.6k
PHP ユーザのための OpenTelemetry 入門 / phpcon2024-opentelemetry
shin1x1
3
2.2k
PHPコードの実行モデルを理解する / Understanding-the-PHP-Execution-Model
shin1x1
2
2.7k
制約の力 - 状態を限定する -
shin1x1
6
5.4k
Apple Silicon Mac 時代の PHP 開発環境構築 2021 / php-dev-env-on-m1-mac-era
shin1x1
2
4.8k
Docker イメージのマルチアーキテクチャビルド / docker-muti-arch-build
shin1x1
1
500
Domain modeling with PHP / domain-modeling-with-php-en
shin1x1
1
280
Other Decks in Technology
See All in Technology
AWSを利用する上で知っておきたい名前解決のはなし(10分版)
nagisa53
10
3.2k
KotlinConf 2025_イベントレポート
sony
1
140
Automating Web Accessibility Testing with AI Agents
maminami373
0
1.3k
AIのグローバルトレンド2025 #scrummikawa / global ai trend
kyonmm
PRO
1
310
Autonomous Database - Dedicated 技術詳細 / adb-d_technical_detail_jp
oracle4engineer
PRO
4
10k
Codeful Serverless / 一人運用でもやり抜く力
_kensh
7
450
品質視点から考える組織デザイン/Organizational Design from Quality
mii3king
0
210
スクラムガイドに載っていないスクラムのはじめかた - チームでスクラムをはじめるときに知っておきたい勘所を集めてみました! - / How to start Scrum that is not written in the Scrum Guide 2nd
takaking22
1
160
エンジニアリングマネージャーの成長の道筋とキャリア / Developers Summit 2025 KANSAI
daiksy
3
890
RSCの時代にReactとフレームワークの境界を探る
uhyo
10
3.5k
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
8.8k
「何となくテストする」を卒業するためにプロダクトが動く仕組みを理解しよう
kawabeaver
0
430
Featured
See All Featured
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
53k
What's in a price? How to price your products and services
michaelherold
246
12k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
61k
Visualization
eitanlees
148
16k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
580
Why You Should Never Use an ORM
jnunemaker
PRO
59
9.5k
Rebuilding a faster, lazier Slack
samanthasiow
83
9.2k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
The Power of CSS Pseudo Elements
geoffreycrofte
77
6k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.9k
Transcript
ܕΛҙࣝͨ͠ 1)1ΞϓϦέʔγϣϯ։ൃ ɹ!shin1x1 2017//08 phpcon 2017
https://php-genba.shin1x1.com/
D .BTBTIJ4IJOCBSB!TIJOY ΞδΣϯμ w1)1ͷܕγεςϜ wܕએݴΛར༻ͨ͠ίʔυ࣮ wυϝΠϯಛԽܕͷ࣮5JQT w͍͞͝ʹ
1)1ͷܕγεςϜ
&MPRVFOU 3FQPTJUPSZ $foo = 123; echo gettype($foo), PHP_EOL; => integer
$foo = 'Hello'; echo gettype($foo), PHP_EOL; => string $foo = [1, 2, 3]; echo gettype($foo), PHP_EOL; => array มܕΛ࣋ͨͳ͍ɺ͕ܕΛ࣋ͭ
&MPRVFOU 3FQPTJUPSZ echo 10 + 5, PHP_EOL; => 15 ԋࢉࢠJOUܕͱqPBUܕ͕ର
҉తܕม
&MPRVFOU 3FQPTJUPSZ echo 10 + "5", PHP_EOL; => 15 TUSJOH͕JOUʹม͞ΕΔ
҉తܕม
&MPRVFOU 3FQPTJUPSZ echo 10 + "5e", PHP_EOL; => 15 ҉తܕม
&MPRVFOU 3FQPTJUPSZ echo 10 + "5e2", PHP_EOL; => ??? ҉తܕม
&MPRVFOU 3FQPTJUPSZ echo 10 + "5e2", PHP_EOL; => 510 ҉తܕม
&MPRVFOU 3FQPTJUPSZ 5e2 ʢ5=Ծ෦, 2=ࢦ෦, 10=جʣ => 5 * (10
** 2) => 500 ˞ࢦදه
&MPRVFOU 3FQPTJUPSZ <?php declare(strict_types=1); function double(int $i): int { return
$i * 2; } double(1); // 2 double(“5e”); // TypeError ܕએݴ
D .BTBTIJ4IJOCBSB!TIJOY 1)1ͷܕγεςϜ w͕ܕΛ࣋ͭ w҉తܕมͰॊೈʹ։ൃ wܕએݴͰݫີʹ։ൃ wϢʔβ͕ελΠϧΛબͰ͖Δ
ܕΛ׆༻ͨ͠1)1ίʔυͷ࣮
D .BTBTIJ4IJOCBSB!TIJOY FY੫ࠐΈՁ֨ͷࢉग़ wՁ֨ ফඅ੫ খҎԼΓࣺͯ wՁ֨ਖ਼ͷ
wফඅ੫খͱ͢Δʢʣ
D .BTBTIJ4IJOCBSB!TIJOY %FNP wܕએݴແ͠ wεΧϥʔܕͰܕએݴ wϢʔβఆٛܕͰܕએݴ
D .BTBTIJ4IJOCBSB!TIJOY %FNP https://github.com/shin1x1/phpcon2017
D .BTBTIJ4IJOCBSB!TIJOY υϝΠϯʹಛԽͨ͠ܕΛ࡞Δ wΞϓϦέʔγϣϯυϝΠϯΛදݱ wυϝΠϯϧʔϧΛݕূ wܕએݴʹΑΔදݱͱڧ੍
&MPRVFOU 3FQPTJUPSZ // ܕએݴແ͠ function calculate($price, $taxRate) // υϝΠϯಛԽܕͰܕએݴ function
calculate( Price $price, TaxRate $taxRate): PriceWithTax
υϝΠϯಛԽܕͷ࣮5JQT
D .BTBTIJ4IJOCBSB!TIJOY ҆қʹܧঝΛΘͳ͍ wܧঝݩΫϥεܕͷద߹Λ͙ wܧঝݩϝιουؚ͕·Εͯ͠·͏ wҕৡτϨΠτͰڞ༗
&MPRVFOU 3FQPTJUPSZ // ܧঝ final class PriceWithTax extends Price {}
ܧঝ $price = PriceWithTaxCalculator::calculate($price, $taxRate); // PriceWithTax Price ܕͳͷͰಈ͍ͯ͠·͏ $price = PriceWithTaxCalculator::calculate($price, $taxRate);
D .BTBTIJ4IJOCBSB!TIJOY Πϛϡʔλϒϧʹ͢Δͱ҆શ wશίϯετϥΫλ wෆม݅ݕূ͕ҰͰࡁΉ wϛϡʔλϒϧͳΒݕূ
D .BTBTIJ4IJOCBSB!TIJOY ϑΝΫτϦϝιου wίϯετϥΫλΛQSJWBUF wϑΝΫτϦϝιου wҾʹΑΔόϦΤʔγϣϯ
&MPRVFOU 3FQPTJUPSZ ϑΝΫτϦϝιου public static function of(float $value): self {
return new self($value); } public static function ofByInt(int $value): self { return new self($value / 100); }
&MPRVFOU 3FQPTJUPSZ ϑΝΫτϦϝιου // float TaxRate::of(0.08); // int TaxRate::ofByInt(8);
D .BTBTIJ4IJOCBSB!TIJOY ։ൃͰͷܕݕࠪ wࣗಈςετ $* w1IQ4UPSN w1IBO
D .BTBTIJ4IJOCBSB!TIJOY 1IQ4UPSN wΤσΟλ ϦΞϧλΠϜͳνΣοΫ w*OTQFDU$PEFT ϓϩδΣΫτશମΛҰׅνΣοΫ w6TBHFTPG ܕͷར༻ҰཡΛྻڍ
D .BTBTIJ4IJOCBSB!TIJOY 1IBO w1)1Ͱ࣮͞Εͨ$-*πʔϧ wܕෆҰகTUSJDUҧͳͲΛݕ w$*Ͱܕݕࠪ https://github.com/phan/phan
͍͞͝ʹ
wܕએݴͰܕΛڧ੍ wυϝΠϯΛܕͰදݱ wܕͰؾ͍͍࣋ͪ։ൃΛ D .BTBTIJ4IJOCBSB!TIJOY ܕΛ׆༻ͨ͠։ൃ
D .BTBTIJ4IJOCBSB!TIJOY !TIJOY !TIJOY D .BTBTIJ4IJOCBSB!TIJOY