PHP:带有值的枚举[重复]

Posted

技术标签:

【中文标题】PHP:带有值的枚举[重复]【英文标题】:PHP: enum with values [duplicate] 【发布时间】:2017-03-25 06:15:49 【问题描述】:

我基本上想在 php 中创建一个类似枚举的类。我的枚举应该有一些值(它们都是静态的)。假设我想要一个枚举,它有一个 ID(ID 永远不能改变)和一个名称(名称在运行时不能改变,它可以在编译时改变——例如对代码所做的更改)。状态不能有任何副作用(即它们只是 getter 并且不能更改实例变量)。除非在初始化类时,否则在运行时也不得创建状态。

对于我的音乐会示例,我有三种可能的状态:OPEN、CLOSED 和 UNKOWN:

class MyState 
    const STATE_OPEN = new MyState(1, "open");
    const STATE_CLOSE = new MyState(2, "closed");
    const STATE_UNKOWN = new MyState(3, "unkown");

    private $name;
    private $state;

    private function __construct(int $state, string $name) 
        $this->state = $state;
        $this->name = $name;
    

    public function getName() : string 
        return $this->name;
    

    public function getState() : int 
        return $this->state;
    

    public function getStateByID(int $state) : MyState  ... 
    public function getStateByName(string $name) : MyState  ... 

我想在我的代码中明确地引用每个状态(MyState::STATE_OPEN 等)。这也应该确保编译器/linter/etc 可以验证状态是否确实存在(不能保证getStateByID 不会抛出异常)。

还有一些(反)序列化器可以在状态保存后加载(通过使用永不更改的 ID)。

不幸的是,如果 const 或 static 实例变量的对象来自同一个类,我无法设置它们。我收到以下错误:

Constant expression contains invalid operations

如何在 PHP 中最好地实现这一点?我知道我可以很容易地用一个 int (class MyState const STATE_OPEN = 1; ) 创建一个枚举,但这有一个主要缺点:枚举不是一个对象,因此不能有方法。我不能以这种方式使用类型提示,我可能会传递一个无效的枚举。例如,function takeMyState(int $state) 实际上可以使用从未定义过的枚举。

【问题讨论】:

【参考方案1】:

替换你的 const 行

  const STATE_OPEN = new MyState(1, "open");

按公共职能:

  public function STATE_OPEN()  return new MyState(1, "open"); 

生成这样的示例程序:

class MyState 
  public function STATE_OPEN()  return new MyState(1, "open"); 
  public function STATE_CLOSED()  return new MyState(2, "closed"); 
  public function STATE_UNKNOWN()  return new MyState(3, "unknown"); 

  private $name;
  private $state;

  private function __construct(int $state, string $name) 
    $this->state = $state;
    $this->name = $name;
  

  public function getName() : string 
    return $this->name;
  

  public function getState() : int 
    return $this->state;
  


$state = MyState::STATE_CLOSED();

echo $state->getName() . "(" . $state->getState() . ")\n";

【讨论】:

以上是关于PHP:带有值的枚举[重复]的主要内容,如果未能解决你的问题,请参考以下文章

带有浮点原始值的 Swift 枚举的“枚举大小写的原始值不是唯一的”

带有枚举值的 jpql IN 查询

带有枚举值的Ecmascript函数参数

从字符串转换为具有大量值的 Java 枚举 [重复]

在核心数据中保存没有原始值的快速枚举

PHP中的完美枚举[重复]