Хочу превратитить $_POST в объект класса.
Если я правильно понимаю, то при несовпадении типа данных выполнение будет прекращено, что и требуется.
С чем я могу столкнуться при использовании такой функции?
Можно ли её как-то улучшить|дополнить|сократить?
$Inductor = ($_Post['someData'] ?? false) or die(Api::errorMsg('someMsg'));
$Recipient = new myClass();
$Object = Valid::cloneFromAny($Inductor, $Recipient);
$Object->runSomeValidation();
class Valid
{
public string|null $error;
/**
* @throws \ReflectionException
*/
public static function cloneFromAny(array|object $Inductor, object $Recipient): object
{
$className = get_class($Recipient);
$classVars = (object)get_class_vars($className);
foreach ($Inductor as $k => $v) {
//Убираем поля, которых класс не ожидает
if (!property_exists($classVars, $k))
continue;
if (is_object($v) || is_array($v)) {
//Если предлагаемое значение итерабельное, то решаем что с ним делать
$typeInClass = (new ReflectionProperty($className, $k))->getType()->getName();
if ($typeInClass === 'array') {
//Массив просто инициализируем
$Recipient->$k = $v;
continue;
}
//Если это объект ожидаемого класса, инициализируем рекурсивно
$Recipient->$k = self::cloneFromAny($v, new $typeInClass());
continue;
}
//В простом случае инициализируем.
// Если тип не приводится, выполнение прекратится с Fatal Error.
$Recipient->$k = $v;
}
return $Recipient;
}
}