Я добавляю раздел очистки на веб-сайт и сталкиваюсь с досадной небольшой проблемой с PDO. Я создал класс ClearanceItem для хранения информации об отдельном элементе. Все свойства элемента защищены, и я создал для них аксессоры и мутаторы. Я создал этот класс по двум причинам:
- Я могу проверить свойства по мере их установки. Это важно для меня, так как база данных заполняется по расписанию из файлов Excel, которые поддерживает клиент. Используя мутаторы, я могу убедиться, что информация в файлах Excel находится в определенных пределах.
- Поскольку сайт доступен на английском и французском языках, авторы могут корректно форматировать данные (например, цены) в зависимости от языка представления.
Я хочу иметь возможность циклически повторять набор результатов PDO, автоматически получая новый экземпляр моего класса ClearanceItem для каждой строки. Это легко сделать, установив режим выборки или используя PDOStatement :: fetchObject (). У меня проблемы, хотя с тем, что свойства защищены. Кажется, что когда PDO создает новый экземпляр класса, он использует что-то под названием Reflection Injection для установки свойств. Это означает, что защищенные свойства устанавливаются непосредственно PDO, минуя созданные мной мутаторы. Из-за этого свойства, которые должны быть числами (и которые установлены как таковые мутаторами), устанавливаются как строки. Хуже всего то, что я использую MySQL GROUP_CONCAT для возврата информации о нескольких хранилищах и инвентаризации в виде одной строки, которую затем следует разбить на массив. Поскольку PDO устанавливает это свойство напрямую, оно заканчивается строкой.
Я легко могу преодолеть эту проблему, имея фабричный метод для создания нового экземпляра ClearanceItem из массива, возвращаемого из строки набора результатов. Это кажется ненужным дополнительным шагом. Кто-нибудь знает, возможно ли, чтобы PDO возвращал экземпляр класса для каждой строки в наборе записей, при этом соблюдая его видимость свойств, используя мутаторы для установки свойств?