Преобразуйте/бросьте объект stdClass в другой класс

Я использую систему хранения других производителей, которая только возвращает меня объекты stdClass в независимо от того, чем я питаюсь по некоторой неясной причине. Таким образом, мне любопытно знать, существует ли способ бросить/преобразовать объект stdClass в абсолютный объект данного типа.

Например, что-то вроде:

//$stdClass is an stdClass instance
$converted = (BusinessClass) $stdClass;

Я просто бросаю stdClass в массив и подаю его конструктору BusinessClass, но возможно существует способ восстановить начальный класс, о котором я не знаю.

Примечание: Я не интересуюсь 'Изменением Ваша система хранения' тип ответов, так как это не интересное место. Считайте это больше академическим вопросом на мощностях языка.

Удачи

86
задан The Mighty Rubber Duck 27 March 2013 в 04:48
поделиться

1 ответ

Смотрите руководство по жонглированию типами о возможных бросках.

Допустимыми приведениями являются:

  • (int), (integer) - приведение к integer
  • (bool), (boolean) - приведение к boolean
  • (float), (double), (real) - приведение к float
  • (string) - приведение к string
  • (array) - приведение к array
  • (object) - приведение к object
  • (unset) - приведение к NULL (PHP 5)

Вам придется написать 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), '"'), ':')
    ));
}
87
ответ дан 24 November 2019 в 08:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: