Я использую систему хранения других производителей, которая только возвращает меня объекты stdClass в независимо от того, чем я питаюсь по некоторой неясной причине. Таким образом, мне любопытно знать, существует ли способ бросить/преобразовать объект stdClass в абсолютный объект данного типа.
Например, что-то вроде:
//$stdClass is an stdClass instance
$converted = (BusinessClass) $stdClass;
Я просто бросаю stdClass в массив и подаю его конструктору BusinessClass, но возможно существует способ восстановить начальный класс, о котором я не знаю.
Примечание: Я не интересуюсь 'Изменением Ваша система хранения' тип ответов, так как это не интересное место. Считайте это больше академическим вопросом на мощностях языка.
Удачи
Смотрите руководство по жонглированию типами о возможных бросках.
Допустимыми приведениями являются:
Вам придется написать Mapper, который выполняет приведение из stdClass в другой конкретный класс. Это не должно быть слишком сложно.
Или, если у вас хакерское настроение, вы можете адаптировать следующий код:
function arrayToObject(array $array, $className) {
return unserialize(sprintf(
'O:%d:"%s"%s',
strlen($className),
$className,
strstr(serialize($array), ':')
));
}
который псевдокастует массив в объект определенного класса. Это работает путем первой сериализации массива, а затем изменения сериализованных данных таким образом, чтобы они представляли определенный класс. Затем результат несериализуется в экземпляр этого класса. Но, как я уже сказал, это хакерский способ, поэтому ожидайте побочных эффектов.
Для объекта к объекту код был бы
function objectToObject($instance, $className) {
return unserialize(sprintf(
'O:%d:"%s"%s',
strlen($className),
$className,
strstr(strstr(serialize($instance), '"'), ':')
));
}