*/ private $enumType; /** * @param class-string $enumType */ public function __construct(ReflectionProperty $originalReflectionProperty, string $enumType) { $this->originalReflectionProperty = $originalReflectionProperty; $this->enumType = $enumType; parent::__construct( $originalReflectionProperty->getDeclaringClass()->getName(), $originalReflectionProperty->getName() ); } /** * {@inheritDoc} * * @param object|null $object * * @return int|string|int[]|string[]|null */ #[ReturnTypeWillChange] public function getValue($object = null) { if ($object === null) { return null; } $enum = $this->originalReflectionProperty->getValue($object); if ($enum === null) { return null; } if (is_array($enum)) { return array_map(static function (BackedEnum $item): mixed { return $item->value; }, $enum); } return $enum->value; } /** * @param object $object * @param int|string|int[]|string[]|null $value */ public function setValue($object, $value = null): void { if ($value !== null) { if (is_array($value)) { $value = array_map(function ($item) use ($object): BackedEnum { return $this->initializeEnumValue($object, $item); }, $value); } else { $value = $this->initializeEnumValue($object, $value); } } $this->originalReflectionProperty->setValue($object, $value); } /** * @param object $object * @param int|string $value */ private function initializeEnumValue($object, $value): BackedEnum { $enumType = $this->enumType; try { return $enumType::from($value); } catch (ValueError $e) { throw MappingException::invalidEnumValue( get_class($object), $this->originalReflectionProperty->getName(), (string) $value, $enumType, $e ); } } }