PHP 8:类中的枚举?

WeS*_*See 8 php php-8

我有一个仅适用于两种类型a和 的课程b

我今天的“旧式”代码:

class Work1 {
    public function do(string $type):string {
        if ($type!="a" && $type!="b")
            throw new Error("wrong type");
        return "type is $type";
    }
}
echo (new Work())->do("a"); // type is a
echo (new Work())->do("c"); // exception: wrong type
Run Code Online (Sandbox Code Playgroud)

现在有了 PHP 8,我们有了enum更好的参数检查选项:

enum WorkType {
    case A;
    case B;
}
class Work2 {
    public function __construct(private WorkType $type) {}
    public function do() {
        return "type is ".$this->type->name;
    }
}
echo (new Work2(WorkType::A))->do(); // type is A
Run Code Online (Sandbox Code Playgroud)

由于 WorkType 和 Work2 不相关,我喜欢将Enum WorkType声明移至类内部Work2。还是语言设计必须将其置于外部?

Rax*_*axi 4

您不能将枚举嵌入到类中;然而,在 PHP 中,枚举实际上类,因此您可以轻松地将类和枚举合并为一个(这可能就是您正在寻找的)

考虑这样的事情:

enum Work {
    case A;
    case B;

    public function do() {
        return match ($this) {
            static::A  => 'Doing A',
            static::B  => 'Doing B',
        };
    }
}


$x = Work::A;
$x->do(); 
Run Code Online (Sandbox Code Playgroud)

  • @nice_dev:是的,据我所知,这基本上是正确的。在很大程度上,枚举语法似乎是构造类的替代语法。它们可以具有方法(其中“$this”指特定的枚举变体)和静态方法(特定于枚举类型,而不是任何特定的变体)等等。但正如 WeSee 已经证明的那样,当然也存在局限性。 (2认同)