枚举(Enum)本质上也是一个类。
枚举体可以包含常量、静态方法、实例方法、魔术方法(仅支持 __call()
、__callStatic()
、__invoke()
),不可以有 静态属性、实例属性、构造函数、析构函数。
枚举是隐式的 final
类,不可以继承。
枚举不可以像类一样直接使用 new
实例化,条目(case)是该枚举类的单例对象,而条目本质上又是类常量,所以语法为 枚举名::条目名;
。
枚举可以实现接口。
枚举可以 use
使用 trait
,但与类不同的是:trait
只可以包含静态方法、实例方法。
枚举和条目都可以有注解。
枚举中的常量、静态方法、实例方法的可见性支持 public
、protected
、private
。
1.纯粹(Pure)枚举
没有值的条目(case),被称为纯粹(Pure)条目。仅包含纯粹条目的枚举被称为纯粹(Pure)枚举。
注意:纯粹条目没有隐式的值。
enum 枚举名
{
case 条目名1;
case 条目名2;
case 条目名N;
}
2.回退(Backed)枚举
有值的条目(case),被称为回退(Backed)条目。仅包含回退条目的枚举被称为回退(Backed)枚举。
回退枚举名后的类型可以为 int
或 string
,表示所有条目的类型必须为 int
或 string
,且一次只支持一种类型(即不支持联合类型 int | string
)。
回退条目的值不会隐式自动生成(比如:类似于数组的索引),所以必须显式定义且必须唯一。
enum 枚举名: 类型
{
case 条目名1 = 值1;
case 条目名2 = 值2;
case 条目名N = 值N;
}
3.访问成员
枚举名::常量名;
枚举名::静态方法名();
枚举名::条目名->实例方法名();
枚举名::条目名->只读实例属性名;
纯粹条目只有一个只读(readonly)属性:name
,返回值是条目名称。
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}
print Suit::Spades->name;
//输出
Spades
回退条目有两个只读(readonly)属性 name
和 value
,value
的返回值为回退条目的值。
enum Suit: string
{
case Hearts = 'H';
case Diamonds = 'D';
case Clubs = 'C';
case Spades = 'S';
}
print Suit::Clubs->name;
print Suit::Clubs->value;
//输出
Clubs
C
纯粹枚举和回退枚举都实现了 UnitEnum
接口,UnitEnum
接口有一个 cases()
静态方法。cases()
静态方法返回一个数组,数组中的元素为枚举的所有条目(按照条目声明时的顺序排序)。
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}
Suit::cases();
//将会产生
[Suit::Hearts, Suit::Diamonds, Suit::Clubs, Suit::Spades]
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/php/phplang/28897.html