如何在 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