VuePressVuePress
首页
  • 基础
  • UI
  • JavaScript
  • CSS
  • postcss
  • Vue3
  • Vue的设计与实现
  • 前端常用插件
  • PHP
  • Laravel
  • Linux
  • 线性代数
Category
AI
jiyun
Timeline
首页
  • 基础
  • UI
  • JavaScript
  • CSS
  • postcss
  • Vue3
  • Vue的设计与实现
  • 前端常用插件
  • PHP
  • Laravel
  • Linux
  • 线性代数
Category
AI
jiyun
Timeline
  • 基础知识

    • 基础语法
    • 面向对象
    • new static
    • 反射
    • ReflectionClass
    • 类型转换
    • 运算符

      • 安全访问运算符
    • 数组的基本操作
  • 类和对象

    • 类属性的默认值
    • 静态类
    • 静态类OR动态类
    • implements 关键字
    • 枚举
      • 概述
      • 纯枚举
      • 支持枚举
      • 枚举方法
      • 静态方法

概述

枚举允许开发人员定义一个自定义类型,仅限于离散数量的可能值之一。

  • 在 PHP 中,枚举是一种特殊的对象。
  • 枚举本身是一个类,其可能的用例都是该类的单实例对象。这意味着枚举用例是有效的对象,可以在任何可以使用对象的地方使用,包括类型检查。
  • 枚举可以有零个或多个 case 定义。零情况枚举在语法上有效,但毫无用处。
  • 枚举最流行的示例是内置布尔类型,它是一种具有合法值 true 和 false 的枚举类型。
  • 枚举与类类似,与类、接口和特征共享相同的命名空间。它们也可以以相同的方式自动加载。

纯枚举

enum Suit
{
    case Hearts;
    case Diamonds;
    case Clubs;
    case Spades;
}

此声明创建了一个名为 Suit 的新枚举类型, 它有且只有四个合法值:Suit::Hearts、Suit::Diamonds、 Suit::Clubs 和 Suit::Spades。变量可以赋给其中一个合法值。

默认情况下,实例本质上不由标量值支持。也就是说,Suit::Hearts 不等于"0"。相反,每个实例都由该名称的单例对象支持。

所有实例都有一个只读属性 name,即实例本身的 区分大小写的名称。

支持枚举

默认情况下,枚举实例没有标量等效项。它们只是单例对象。 但是,在很多情况下,枚举实例需要能够往返于数据库或类似的数据存储区,因此,定义一个内置的标量等效项是有用的。

enum Suit: string
{
    case Hearts = 'H';
    case Diamonds = 'D';
    case Clubs = 'C';
    case Spades = 'S';
}

支持枚举可能由 int 或 string 类型支持,并且给定枚举一次仅支持一种类型(即不支持 int|string 的并集)。

支持枚举具有额外的只读属性value,它是 定义中指定的值。

枚举方法

枚举(纯枚举和支持枚举)可以包含方法,也可以实现接口。如果枚举实现了接口,则该接口的任何类型检查也将接受该枚举的所有情况。

interface Colorful
{
    public function color(): string;
}

enum Suit implements Colorful
{
    case Hearts;
    case Diamonds;
    case Clubs;
    case Spades;

    // Fulfills the interface contract.
    public function color(): string
    {
        // 在方法内部,$this变量被定义并引用 Case 实例。
        return match($this) {
            Suit::Hearts, Suit::Diamonds => 'Red',
            Suit::Clubs, Suit::Spades => 'Black',
        };
    }

    // Not part of an interface; that's fine.
    public function shape(): string
    {
        return "Rectangle";
    }
}

function paint(Colorful $c)
{
   /* ... */
}

paint(Suit::Clubs);  // Works

print Suit::Diamonds->shape(); // prints "Rectangle"

在此示例中, Suit 的所有四个实例都具有两个方法 color() 和 shape()。就调用代码和类型检查而言,它们的行为与任何其他对象实例完全相同。

方法可以是公共的、私有的或受保护的,但实际上私有的和受保护的方法是等效的,因为不允许继承。

静态方法

枚举也可能有静态方法。枚举本身的静态方法主要用于替代构造函数。

enum Size
{
    case Small;
    case Medium;
    case Large;

    public static function fromLength(int $cm): static
    {
        return match(true) {
            $cm < 50 => static::Small,
            $cm < 100 => static::Medium,
            default => static::Large,
        };
    }
}
Last Updated:
Contributors: BaronYan
Prev
implements 关键字