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のEnum事情
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Takayuki Fujisawa
June 30, 2020
Programming
770
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PHPのEnum事情
Takayuki Fujisawa
June 30, 2020
More Decks by Takayuki Fujisawa
See All by Takayuki Fujisawa
RFC駆動のPHP学習術 Fukuoka.php edition
takayukifujisawa
1
450
RFC駆動のPHP学習術.pdf
takayukifujisawa
3
440
レガシーなアプリケーションにこそTypeScriptを採用するべきではないかと思ったのでちょっとまとめてみたよっていう話をするスライドです / Legacy code needs TypeScript
takayukifujisawa
1
440
History of JavaScript
takayukifujisawa
1
230
usb_boot_ubuntu
takayukifujisawa
0
260
なぜPHPにはEnumがないのか
takayukifujisawa
0
5.2k
Other Decks in Programming
See All in Programming
Why Laravel apps break—Mastering the fundamentals to keep them maintainable
kentaroutakeda
1
340
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
250
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
450
AI駆動開発勉強会 広島支部 第一回勉強会 AI駆動開発概要とワークショップ
hayatoshimiu
0
440
プラグインで拡張される Context をtype-safe にする難しさと設計判断
kazupon
2
590
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.5k
CLIであることを活かしたGitHub Copilot CLI活用術 / GitHub Copilot CLI Pro Tips & Tricks
nao_mk2
1
1.2k
運用エージェントは "作る" から "育てる" へ - 記憶と自己進化の3層設計パターン / self-evolving-agents-three-layer-agent-design
gawa
12
3.5k
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
750
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
250
Modding RubyKaigi for Myself
yui_knk
0
890
AutonomyとControlのあいだ:Graflowで記述するAIエージェント協調
myui
0
110
Featured
See All Featured
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
54k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
200
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
190
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
600
Amusing Abliteration
ianozsvald
1
200
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
350
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2k
Designing for Timeless Needs
cassininazir
1
250
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.2k
Transcript
PHPのEnum事情 2020/06 PHP::LT会 @miracle_fjsw 1
whoami $iam = [ "名前" => "Takayuki Fujisawa", "会社" =>
"株式会社ラクス", "仕事" => ["品質管理", "標準化", "勉強会開催するマン"], "トゥイッター" => "@miracle_fjsw" ] 2
注︓⾼速ですっ⾶ばすのであとでゆっくり資料⾒てください 3
オレ的3⼤PHPにあったらいいのになリスト 4
1. Generics 2. Enum 3. 寝てる間に仕事してくれる機能 5
今⽇はEnumの話をします 6
PHPにEnum存在しない問題 7
Twitterで「php enum」を検索すると… 「え︖PHPってEnumないの︖」 「PHPにEnumほしい」 「PHPにEnumさえあれば…」 というような声多数 8
ちなみにEnumとは 列挙型(enumration type) いーなむ、いにゅーむ、えなむ… 複数の異なる定数を⼀つの集合として定義するもの こういうやつ enum Planet { MERCURY,
VENUS, EARTH, MARS, ... } 9
Enumがあると何が嬉しいのか 定数をただの数値や⽂字列ではなく意味を持った集合として定義できる 10
Enumがない場合こうなる function distance(int from_planet_id, int dist_planet_id) { // 処理 }
11
Enumがない場合こうなる const PLANET_ID_MERCURY = 1; const PLANET_ID_VENUS = 2; const
PLANET_ID_EARTH = 3; const PLANET_ID_MARS = 4; //// $distance = distance(PLANET_ID_MERCURY, PLANET_ID_VENUS); 12
Enumがない場合こうなる $distance = distance(PLANET_ID_MERCURY, PLANET_ID_VENUS); 定数︓PLANET_ID_xxx はあくまで、ラベルをつけただけで内部的にはただの整数 値 distance(1, 2);
定数を使わず呼び出せるがコードの意図がわからない distance(1, 100000); 想定しない値でも呼び出せる distance(OTHER_CONSTANT_A, OTHER_CONSTANT_B); 関係ない定数 メソッドを使う⼈がちゃんと使ってくれることを祈るしかない PHPDocやドキュメントなどで使い⽅の説明をしなければならない 内部での⼊⼒値チェックを⾏わなければならない 13
Enumがあればこうできる enum Planet { MERCURY, VENUS, EARTH, MARS, ... }
function distance(Planet from, Planet dist) { // 処理 } $distance = distance(Planet::MERCURY, Planet::VENUS); メソッドの仕様がコードをみるだけで⼀⽬瞭然 型が縛られるため、Planetで定義した要素以外渡ってこない(安全) コードはいかにその仕様や概念を読み⼿に伝えるかが重要 定数によって管理されているそれはどこまで⾏っても数値や⽂字列でしかない Enumを使うことで意味・概念をそのまま表現できる 他にも、返却値をbooleanや定数ではなく、Enumで表現したり⾊々便利 14
実は、PHPにもEnumはあります 15
PHPにもEnumはあります SplEnum (Spl … Standard PHP Libraly) なんや、PHPにEnumあるやんけ︕ 16
が、しかし 17
実 験 的 18
⾃ ⼰ 責 任 19
『標準』ライブラリとはなんなのか、深く⾃問⾃答 20
あまつさえ 「このPECLは放棄されています」(7⽇前に投稿) 21
放棄された標準ライブラリ(Standard PHP Libraly) 22
PHPにもEnumはあります 23
PHPer Enum作りがち問題 24
PHPer Enum作りがち問題 Enumないなら作っちゃえ myclabs/php-enum marc-mabe/php-enum BenSampo/laravel-enum spatie/enum kawanamiyuu/K9u.Enum ※へーしゃのリードエンジニアのリポジトリ 他、多数
「php enum」で検索すると⼤量の「作ってみました」系記事 25
Enumが欲しいという要望は多いものの、標準仕様には未採⽤ 26
RFCを⾒てみよう 2015年に提案があるものの、未だドラフト。 27
RFCを⾒てみよう もっと古いのもあるが、議論中で⽌まっている 28
どうなってるの︖ 29
この謎を解くべく、コミュニティのディスカッションの中⾝を追 う PHPコミュニティのメーリングリスト https://externals.io/ Enum関連で盛り上がっているスレッドが2本(2012年,2015年) 2012年の議論は凄まじい激論 2012年というとPHP5.4くらい すでにタイプヒンティング(引数の型指定 ※)などは導⼊されておりPHPが 型付けを意識しはじめている段階
※ … クラス/インタフェース、配列のみ。intやstringなどのスカラ型は⾮対 応。 30
2012年の議論を超意訳して抜粋 「Enum要らない派」の猛攻が⽬⽴つ 厳密な型付けは実⾏時の速度を落とすからアカン。 そもそもコンパイル⾔語じゃないから厳密に型をしばったところで、事前に ⾒つけられへん。 ボンクラが間違った実装しとったら実⾏時に落ちるやろ。 厳密な型付けが欲しい︖Java使えば︖ PHPは緩い型付けの⾔語なんや。便利なシーンも多いやろ。 厳密さが欲しい⼈ばっかりやないねん。⾃分が正しいみたいに⾔うなや。 という泥沼感のある議論が、なんだかよくわからないうちにストップ
31
Java使えば︖(圧倒的説得⼒) 32
実際、Enumは必要なのか︖ 便利で強⼒はあるが 「必ず要る」わけではない。 クラスを使って同じことが実現できる。 class Planet { ... } class
Mercury extends Planet { ... } class Venus extends Planet { ... } class Earth extends Planet { ... } function distance(Planet from, Planet dist) { // 処理 } $distance = distance(Mercury::getInstance(), Venus::getInstance()); 当時のPHPコミュニティの⼈たちの意⾒も理解できる。 33
ところが、2015年の議論では⾵向きが変わる 突如「Enumについて議論しようず︕」というスレが⽴つ 2015年というとPHP7のリリース。 厳密な型判定(strict)モードの追加 スカラ型宣⾔の機能追加(引数の型にintやstringなどを指定できる) 現在ドラフト中のRFCが作られたのもこの時期 34
2015年の議論 2012年とは違い、PHPに組み込むとしたらどのような仕様が良いのかが前向きに 議論されている Enumに振る舞いをもたせる必要あるか(※)、とか、シリアライズする時どうす るの、とか ※C++などのEnumは定数の集合だが、JavaのEnumはクラスの亜種であり、メ ソッドを持てる PHPに組み込む上での実装上の問題についての議論なども 過去に⾒られた「Enum要らない派」がほとんどいない 35
つまり… PHPはもともと緩い型付けで柔軟に記述できる⾔語 これは別の視点ではあまり深く考えずにサクッと作れる強⼒な⾔語、とも⾔ える PHPの⽣みの親であるラスマス・ラードフの⾔からも窺い知れる 『PHPは問題を解決するシンプルなツール以上のものではない』 実際そうだし、だからこそ広く愛⽤されるに⾄った⾔語。 36
つまり… かつてはEnumのような厳密に型を意識したいというアプローチは受け⼊れられに くかった そもそも必要としている⼈ばかりではなかった(代替⼿段もあるし) ⼀⽅で、ここ数年では徐々にコミュニティの考え⽅が変わってきており、PHP⾃ 体が型を意識した⾔語に変容してきている 現在はその過渡期であり、完全にEnum採⽤が棄却されたわけではない 37
という資料をまとめていた折 なんと3回⽬のRFC提案(現在ドラフト) 38
PHP8でも型に関する⼤きな変更が加えられた UnionType public function foo(Foo|Bar $input): int|float; MixedType var_dump(mixed $expression):
void 39
しかも、UnionTypeは⼀度棄却された後、再提案のうえ、採⽤ 40
PHPは開発者が必要とする機能を追加してきた⾔語 41
求めよ さらば与えられん 42
私達が求め続ける限り、EnumがPHPに導⼊される⽇ は遠くない 43
かもしれない 44
以上。 45