getType()->allowsNull() && !$reflect->isInitialized($object)) { $uninitializedRequiredProperties[] = $property; } } return $uninitializedRequiredProperties; } public static function isPropertyInitialized(object $object, string $propertyName): bool { $reflect = new \ReflectionProperty(get_class($object), $propertyName); return $reflect->isInitialized($object); } public static function getProperties(object $object, int $filter = \ReflectionProperty::IS_PUBLIC): array { $reflect = new \ReflectionClass($object); return array_map(fn ($x) => $x->getName(), $reflect->getProperties($filter)); } }