如何检查 属性 是否是 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.
我有一个函数可以从数据库动态构建对象。
我的 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.