classes/ClassMapper.md
Класс ClassMapper
Пространство имён: goodboyalex\php_components_pack
Полное имя класса: goodboyalex\php_components_pack\ClassMapper
Тип: финальный класс
Версия: 1.1
Доступно с: 1.0
Описание
Класс предназначен для сопоставления классов и объектов — обеспечивает:
- перенос свойств между объектами с учётом правил;
- подготовку и парсинг свойств класса;
- преобразование массивов в объекты классов;
- работу со значениями по умолчанию для типов.
Автор
- Имя: Александр Бабаев
- Email: contact_with_us@babaev-an.ru
Метаданные
- PSR‑4:
goodboyalex/php_components_pack - Модификатор класса:
final - Ключевые зависимости:
goodboyalex\php_components_pack\attributes\GetOnlygoodboyalex\php_components_pack\models\ClassMapOptionsgoodboyalex\php_components_pack\types\GUID
Методы
mapClass()
public static function mapClass(
object $from,
object $to,
ClassMapOptions $options = new ClassMapOptions()
): void
Описание:
Передаёт одинаковые параметры из класса‑донора ($from) в класс‑приёмник ($to), учитывая:
- игнорируемые свойства (
$ignoredProperties); - разрешённые свойства (
$allowedProperties).
Параметры:
$from(object) — класс‑донор.$to(object) — класс‑приёмник.$options(ClassMapOptions) — параметры привязки свойств (по умолчанию — новый экземплярClassMapOptions).
Возвращаемое значение:
Не возвращает значение (void).
prepareClassProperties()
public static function prepareClassProperties(
array $params,
ReflectionClass $classReflector,
ClassMapOptions $options = new ClassMapOptions()
): array
Описание:
Подготавливает значения свойств класса на основе входных данных.
Параметры:
$params(array) — данные запроса.$classReflector(ReflectionClass) — анализатор класса.$options(ClassMapOptions) — параметры привязки (по умолчанию — новый экземплярClassMapOptions).
Возвращаемое значение:
array— массив данных класса.
getClassParametersArrayParser()
public static function getClassParametersArrayParser(
array &$source,
array $parametersKeys,
mixed $value,
ClassMapOptions $options = new ClassMapOptions()
): void
Описание:
Парсит массив свойств класса, разбивая ключи на части (например, Page_Meta_Id → ["Page", "Meta", "Id"]).
Параметры:
$source(array&) — исходный массив (передаётся по ссылке, модифицируется в процессе).$parametersKeys(array) — массив имён свойств.$value(mixed) — значение свойства.$options(ClassMapOptions) — параметры привязки свойств (по умолчанию — новый экземплярClassMapOptions).
Возвращаемое значение:
Не возвращает значение (void).
mapToClassProperty()
public static function mapToClassProperty(
string $className,
array $properties
): mixed
Описание:
Преобразует массив данных в объект указанного класса.
Параметры:
$className(string) — имя класса.$properties(array) — массив данных.
Возвращаемое значение:
mixed— объект класса.
Исключения:
Exception— при ошибках создания объекта.
setParameterToClass()
public static function setParameterToClass(
ReflectionClass $classReflector,
string $propertyName,
mixed $classObj,
mixed $value
): void
Описание:
Присваивает значение параметра объекту класса через рефлектор.
Параметры:
$classReflector(ReflectionClass) — рефлектор класса.$propertyName(string) — имя свойства.$classObj(mixed) — объект класса.$value(mixed) — значение.
Возвращаемое значение:
Не возвращает значение (void).
Исключения:
Exception— при ошибках установки значения.
getDefaults()
public static function getDefaults(string $typeName): mixed
Описание:
Возвращает значение по умолчанию для указанного типа.
Параметры:
$typeName(string) — название типа (например,"int","string").
Возвращаемое значение:
mixed— значение по умолчанию для типа.
Примеры использования
Пример 1: Перенос свойств между объектами
$donor = new SomeClass();
$receiver = new AnotherClass();
ClassMapper::mapClass($donor, $receiver, new ClassMapOptions(allowed: ['id', 'name'], ignored: ['created_at']);
Пример 2: Создание объекта из массива
$data = ['id' => 1, 'name' => 'Test'];
$object = ClassMapper::mapToClassProperty('App\Models\User', $data);
Пример 3: Подготовка свойств класса
$reflector = new ReflectionClass(SomeClass::class);
$prepared = ClassMapper::prepareClassProperties(
['id' => 1],
$reflector,
new ClassMapOptions()
);
Примечания
- Все методы — статические, не требуют создания экземпляра класса.
- Для работы с рефлексией требуется расширение
Reflectionв PHP. - Класс использует
ClassMapOptionsдля гибкой настройки правил сопоставления. - Метод
mapToClassProperty()может выбрасывать исключение при ошибках создания объекта.
Дополнительные сведения
Зависимости и требования
Обязательные классы/интерфейсы:
ClassMapOptions— определяет правила сопоставления свойств;ReflectionClass— используется для анализа структуры классов;- базовые типы PHP (
string,array,mixed).
Требования к окружению:
- PHP 8.0+ (для поддержки типизации и синтаксиса);
- включённое расширение
Reflection(стандартно в PHP).
Особенности реализации
-
Безопасность типов
Все методы строго типизированы, что снижает риск ошибок при передаче параметров. -
Гибкость конфигурации
ЧерезClassMapOptionsможно:- явно указывать разрешённые свойства (
allowedProperties); - исключать свойства из сопоставления (
ignoredProperties); - настраивать поведение парсера.
- явно указывать разрешённые свойства (
-
Работа с вложенными структурами
МетодgetClassParametersArrayParser()поддерживает разбиение составных ключей (например,User_Profile_Id→['User', 'Profile', 'Id']). -
Обработка исключений
Критические операции (например, создание объектов) оборачиваются в try‑catch с выбросомException.
Рекомендации по использованию
-
Для маппинга объектов
ИспользуйтеmapClass()с чётко заданнымиallowedProperties, чтобы избежать неожиданного переноса данных. -
Для преобразования массивов
Перед вызовомmapToClassProperty()убедитесь, что:- класс существует;
- массив содержит все обязательные поля.
-
Для отладки
Включите логирование исключений изsetParameterToClass(), чтобы отслеживать ошибки установки свойств.
Типичные сценарии применения
-
API‑интеграции
Преобразование JSON‑ответов в объекты бизнес‑логики:$user = ClassMapper::mapToClassProperty( User::class, json_decode($apiResponse, true) ); -
Миграции данных
Перенос свойств между устаревшими и новыми классами:ClassMapper::mapClass($legacyObject, $newObject, new ClassMapOptions([ 'allowedProperties' => ['id', 'title', 'content'] ])); -
Валидация входных данных
Подготовка параметров перед передачей в конструктор:$validated = ClassMapper::prepareClassProperties( $_POST, new ReflectionClass(FormModel::class) );
Ограничения и известные проблемы
-
Отсутствие поддержки интерфейсов
Класс не проверяет соответствие интерфейсов при маппинге. -
Ограниченная обработка типов
getDefaults()поддерживает только базовые типы PHP (не учитывает кастомные классы). -
Нет кэширования рефлектора
Повторный вызовprepareClassProperties()для одного класса создаёт новыйReflectionClass. -
Строгая типизация
При несоответствии типов вsetParameterToClass()будет выброшено исключение.