关于 PHP Enum
总结
-
PHPのEnumについてちゃんと理解してまとめる
“Enum是什么意思呢?”
-
取りうる値を限定した独自の型を定義できるクラスに似ているもの。
似ているだけでクラスではない。クラスやオブジェクトの上に構築されている。
枚举规则
-
コンストラクタ、デストラクタは書けない。
継承をすることも継承されることもできない。
プロパティーは許可されていない。
caseをcloneすることはサポートされていない。
使う前に宣言しないといけない。
newを使って直接インスタンス化できない。
__callと__callStaticと__invoke以外のマジックメソッドは許可されていない。
__CLASS__と__FUNCTION__以外のマジック定数は許可されていない。
インターフェースの実装可能
アトリビュートを深する事が可能
定義可能メソッド
public
private
protected
定義可能staticメソッド
public
private
protected
枚举的类型选项
PureEnum 纯枚举
PureCaseだけを含むEnumのこと。
PureCase
関連するデータが無い名前だけのCase
例
name;
支持的枚举类型
スカラー値を持つCaseが含まれるEnumのこと。
スカラー値
スカラー型の値のこと
PHPだと論理型(bool)、整数型(int)、浮動小数点型(float, double, real)、文字列型(string)がスカラー型
例
value;
BackedEnumはBackedEnumインターフェースを実装しているらしい。そのためfromとtryFromという2個のstaticな関数を呼び出す事ができる。
from関数を使って値からEnumのインスタンスを取得する。
下記のようにfrom関数を用いることで引数の値とcaseに紐づくスカラー値を比較、一致するものがあれば当該caseのオブジェクトを返す。(引数とスカラー値の比較はPHP側の設定で「強い比較」「弱い比較」を選択できる。強い比較 → PHP declare(strict_types=1)ってなんだ!?)
函数的定义
PureEnum、BackedEnum共に関数を定義することは可能である。(public, private, protectedの関数が定義できるけど、結局Enumは継承できないから何を指定してもprotectedと実質は同じ)
例
foo();
// 「トランプは楽しい」と出力される
echo $suit;
トレイトをuseすることもできる。
foo();
// 「トランプは楽しい」と出力される
echo $suit;
下記のように記載すればPureEnumでも紐づく値を設定する事ができる。
‘H’,
Suit::Diamonds => ‘D’,
Suit::Clubs => ‘C’,
Suit::Spades => ‘S’,
};
}
}
// 「H」と出力される
echo Suit::Hearts->values();
コンストラクタの代わりをさせたいならstatic関数を定義する。
Suit::Hearts,
2 => Suit::Diamonds,
3 => Suit::Clubs,
4 => Suit::Spades,
};
}
}
$suit = Suit::foo(1);
// 「enum(Suit::Hearts)」と出力される
var_dump($suit);
将Enum的case以数组形式返回。
下記のように記載することでEnumのcaseを宣言された順番で配列で取得する事ができる。
文献参考
-
https://www.php.net/manual/ja/language.enumerations.php