开发者问题收集

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

2022-05-03
1648

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

我的类扩展了一个带有构建函数的 DBModel 类:

/* 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 是否为枚举,以便将值设置为枚举而不是字符串,这会导致错误。

有人知道怎么做吗?

2个回答

我能想到两种方法来实现这一点

1:

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

2:

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

我的解决方案基于@IMSoP 答案和 这个问题 ,基本上基于 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.

J.BizMai
2022-05-05