PHP 枚举 `__toString` 魔术方法

rel*_*89n 27 php enums php-8.1

我想知道为什么不可能提供__toString枚举的实现。

IDE 提示“Enum 可能不包含 '__toString'”。然而,这是我创建枚举后首先想到的事情。以前,我在代码中使用值对象封装字符串,必要时使用字符串转换。现在我想将它们迁移到枚举中,但它们会抵制。

#[Immutable]
enum SaveKlinesFromApiQueue: string
{
    case DEFAULT = 'save_klines_from_api_queue';
    case PRIORITY = 'save_klines_from_api_priority_queue';

    public function __toString(): string
    {
        return $this->value;
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 13

const我认为如果你想像在常规类中一样使用 Enum ,你不应该使用它。考虑创建一个抽象类,如下所示:

abstract class SaveKlinesFromApiQueue
{
    public const DEFAULT = 'save_klines_from_api_queue';
    public const PRIORITY = 'save_klines_from_api_priority_queue';
}
Run Code Online (Sandbox Code Playgroud)

除了正确使用 Enum 之外,在您的情况下您还可以使用:

echo SaveKlinesFromApiQueue::DEFAULT->name;
Run Code Online (Sandbox Code Playgroud)

Result: "DEFAULT"

或者

echo SaveKlinesFromApiQueue::DEFAULT->value;
Run Code Online (Sandbox Code Playgroud)

Result: "save_klines_from_api_queue"


Pug*_* Se 3

正如克里斯提到的,魔法方法是不被允许的。

对于 2 个最(?)常见的用例:

要获取单个字符串值,您可以使用->value.

如果您想要所有这些的字符串值,只需在方法中添加一个循环:

    public static function strings(): array
    {
        $strings = [];
        foreach(self::cases() as $case) {
            $strings[] = $case->value;
        }
        return $strings;
    }
Run Code Online (Sandbox Code Playgroud)

  • 事实并非如此。当项目有[值对象](https://martinfowler.com/bliki/ValueObject.html),其行为类似于枚举,并且此类对象定义魔术方法时 - 你(好吧,我)就不走运了。项目中的某个地方可能没有启用严格类型,并且某些方法参数是用字符串进行类型提示的(这是在没有值对象时完成的)。值对象实现了 __toString 方法并且工作正常。现在,当枚举存在时,我想将此类值对象转换为枚举,但显然我无法毫无麻烦地做到这一点。 (3认同)