列挙型がPHP8.1でリリースされて約1年が経ちました。 みなさんの現場で列挙型はうまく活用されていますか?
Java, pythonなど、他言語の列挙型の仕様と比較しながら、 PHPにおける列挙型の役割や使い方を示します。
列挙型を使いこなしてより楽しく、そして安全なシステム作りをしていきましょう!
他言語と比較して今こそ理解しよう!目指せ、列挙型マスター!~なりたいな ならなくちゃ 絶対なってやる ~2023/03/25 PHPerKaigi 2023 #phperkaigi #a
View Slide
発表のアウトライン● 対象聴者○ 列挙型を使う動機がわかない○ 既存のコードを書き換えたほうがいいのか● この発表のゴール○ 列挙型の使い方のイメージができる○ 列挙型でできること・できないことがざっくりわかる
そーく @soachrバックエンドエンジニア2016年4月〜2023年2月:株式会社ラクス自社サービスのワンストップ開発に従事インターン講師やら社内技術発表会の運営などもしたことあり2023年3月〜:Home Security Agent🏠👮次に向けて”はねやすめ”中趣味 パン作り/プラモデル組み(創作少女庭園、Chitoceriumも気になる) どきっとする言葉”運用でカバー” created by VRoidStudio(ピクシブ様感謝)
列挙型ができること
”タイプ”enum Type {case FLAME;case WATER;case NORMAL;}
不利有利ふつうふつうふつうふつう”タイプ相性”
enum Type {case FLAME;case WATER;case NORMAL;public function compareTo(Type $target): TypeCompatibility {switch($this) {case Type::WATER:return match($target) {Type::FLAME => TypeCompatibility::ADVANTAGE,Type::WATER => TypeCompatibility::ACTUAL,Type::NORMAL => TypeCompatibility::ACTUAL,};break;// …}// …
// 呼び出し側$myMoveType = Type::WATER;$opponentType = Type::FLAME;$myMoveType->compareTo($opponentType)); // 有利
他言語と比較してできること・できないこと
表にまとめてみた
比較対象言語● 歴史がまあまあ長い● 幅広い業界で利用されている● 初めて学ぶ言語になることが多い(らしい)
できること・できないこと列挙子自体がインスタンス(シングルトンオブジェクト)○ ○ ○列挙子に単一の整数・文字列を割り当てる ○ ○ ○列挙子に任意の整数・文字列以外を割り当てる× ○ ○インスタンスメソッドを定義する ○ ○ ○クラスメソッドを定義する ○ ○ ○自身を継承させる × × ○
enum Move {naminori("波にのる", Type.WATER, 90),kaenhosya("火炎を放射する", Type.FLAME, 90),hakaikousen("超光速で破壊する", Type.NORMAL, 150);private String moveName;private Type type;private int attackPoint;…PHPではできないこと - 例1:わざ
enum TypeCompatibility {ADVANTAGE(new AdvantageTypeDamageMultiplier()),DISADVANTAGE( new DisAdvantageTypeDamageMultiplier()),ACTUAL(new ActualTypeDamageMultiplier());private TypeDamageMultiplier multiplier;//…}interface TypeDamageMultiplier {public double multiplier();}class AdvantageTypeDamageMultiplier implementsTypeDamageMultiplier {public double multiplier() {return 2;}}0.5倍2倍1.0倍PHPではできないこと - 例2:相性ダメージ倍率
まとめ● 自分の値による振る舞いの違いを自分の中で定義することができる○ 定数では別のところにロジックを書く必要があった● 他の言語では列挙子のインスタンスにメンバを持つことができる○ より凝縮度の高いコードになりそう○ でもできることが増えるとスパゲッティにもなりがち(メンバ多すぎ問題)\列挙型を利用してより堅牢なコードを!/
ご清聴ありがとうございました
PHP) What’s the difference Class and Enum ?can have/do Class Enumproperty(member) ○ ×construct ○ ×instance method ○ ○class constant ○ ○class method ○ ○implement interface ○ ○inherit ○ ×clone ○ ×