如何检查 属性 是否是 php 8.1 中的枚举

How to check if a property is an Enum in php 8.1

我有一个函数可以从数据库动态构建对象。

我的 class 使用构建函数扩展了 DBModel Class :

/* Function to setup the object dynamically from database */
protected function build(){
    global $db;
    if( !empty( $this->query ) ){
      $data_from_db = $db->raw( $this->query );

      if( !empty( $data_from_db ) ){
        foreach ( $data_from_db as $property => $value ){
          $class = get_called_class();
          if( property_exists( $class, $property ) ){
            $rp = new ReflectionProperty( $class, $property);
            if( isset( $rp ) && $rp->getType() ){
              // print_r($rp->getType()->getName() );
              $this->{$property} = $value;
            }
          }
        }
      }
    }
  }

我正在尝试检测 属性 是否是枚举,否则我会收到此错误:

Fatal error: Uncaught TypeError: Cannot assign string to property MyClass::$myEnumProperty of type MyEnumNameType

目前我可以用 $rp->getType()->getName() 得到 MyEnumNameType 但我无法检查 MyEnumNameType 是否是枚举以便将值设置为枚举而不是出错的字符串。

有人知道这样做的方法吗?

我可以想到两种方法来做到这一点

1:

var_dump($this->{$property} instanceof \UnitEnum );

2:

if (is_object($this->{$property})) {
    $rc = new ReflectionClass($this->{$property});
    var_dump($rc->isEnum());
}

我的解决方案基于@IMSoP 答案和this question,基本上是基于enum_exists() :

protected function build(){
    global $db;
    if( !empty( $this->query ) ){
      $data_from_db = $db->raw( $this->query );

      if( !empty( $data_from_db ) ){
        foreach ( $data_from_db as $property => $value ){
          $class = get_called_class();
          if( property_exists( $class, $property ) ){
            $rp = new ReflectionProperty( $class, $property);

            if( isset( $rp ) && enum_exists( $rp->getType()->getName() ) ){
              $this->{$property} = call_user_func( [$rp->getType()->getName(), 'from'], $value );
            }else{
              $this->{$property} = $value;
            }
          }else{
            $this->{$property} = $value;
          }
        }
      }
    }
  }

Notice : $rc->isEnum() does not exist.