Upgrade to Pro — share decks privately, control downloads, hide ads and more …

なぜPHPにはEnumがないのか

 なぜPHPにはEnumがないのか

Takayuki Fujisawa

October 30, 2019
Tweet

More Decks by Takayuki Fujisawa

Other Decks in Programming

Transcript

  1. whoami $iam = [ " 名前" => "Takayuki Fujisawa", "

    会社" => " 株式会社ラクス", " 仕事" => ["R&D", " 技術広報, " エンジニアリングカルチャー促進", "PMO"], " トゥイッター" => "@miracle_fjsw" ] 2
  2. 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); 8
  3. 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 やドキュメントなどで使い⽅の説明をしなければならない 内部での⼊⼒値チェックを⾏わなければならない 9
  4. Enum があればこうできる enum Planet { MERCURY, VENUS, EARTH, MARS, ...

    } function distance(Planet from, Planet dist) { // 処理 } $distance = distance(Planet::MERCURY, Planet::VENUS); メソッドの仕様がコードをみるだけで⼀⽬瞭然 型が縛られるため、Planet で定義した要素以外渡ってこない(安全) コードはいかにその仕様や概念を読み⼿に伝えるかが重要 定数によって管理されているそれはどこまで⾏っても数値や⽂字列でしかない Enum を使うことで意味‧概念をそのまま表現できる 他にも、返却値をboolean や定数ではなく、Enum で表現したり⾊々便利 10
  5. この謎を解くべく、過去のディスカッションの中⾝を追う PHP コミュニティのメーリングリスト https://externals.io/ Enum 関連で盛り上がっているスレッドが2 本(2012 年,2015 年) 2012

    年の議論は凄まじい激論 2012 年というとPHP5.4 くらい すでにタイプヒンティング(引数の型指定 ※)などは導⼊されておりPHP が 型付けを意識しはじめている段階 ※ … クラス/ インタフェース、配列のみ。int やstring などのスカラ型は⾮対 応。 19
  6. 実際、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 コミュニティの⼈たちの意⾒も理解できる。 21
  7. 2015 年の議論 2012 年とは違い、PHP に組み込むとしたらどのような仕様が良いのかが前向きに 議論されている Enum に振る舞いをもたせる必要あるか(※)、とか、シリアライズする時どうす るの、とか ※C++

    などのEnum は定数の集合だが、Java のEnum はクラスの亜種であり、メ ソッドを持てる PHP に組み込む上での実装上の問題についての議論なども 過去に⾒られた「Enum 要らない派」がほとんどいない 23