Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert/cast an stdClass object to another class

Tags:

php

stdclass

I'm using a third party storage system that only returns me stdClass objects no matter what I feed in for some obscure reason. So I'm curious to know if there is a way to cast/convert an stdClass object into a full fledged object of a given type.

For instance something along the lines of:

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

I am just casting the stdClass into an array and feed it to the BusinessClass constructor, but maybe there is a way to restore the initial class that I am not aware of.

Note: I am not interested in 'Change your storage system' type of answers since it is not the point of interest. Please consider it more an academic question on the language capacities.

Cheers

like image 901
The Mighty Rubber Duck Avatar asked Jul 14 '10 06:07

The Mighty Rubber Duck


1 Answers

See the manual on Type Juggling on possible casts.

The casts allowed are:

  • (int), (integer) - cast to integer
  • (bool), (boolean) - cast to boolean
  • (float), (double), (real) - cast to float
  • (string) - cast to string
  • (array) - cast to array
  • (object) - cast to object
  • (unset) - cast to NULL (PHP 5)

You would have to write a Mapper that does the casting from stdClass to another concrete class. Shouldn't be too hard to do.

Or, if you are in a hackish mood, you could adapt the following code:

function arrayToObject(array $array, $className) {     return unserialize(sprintf(         'O:%d:"%s"%s',         strlen($className),         $className,         strstr(serialize($array), ':')     )); } 

which pseudocasts an array to an object of a certain class. This works by first serializing the array and then changing the serialized data so that it represents a certain class. The result is unserialized to an instance of this class then. But like I said, it's hackish, so expect side-effects.

For object to object, the code would be

function objectToObject($instance, $className) {     return unserialize(sprintf(         'O:%d:"%s"%s',         strlen($className),         $className,         strstr(strstr(serialize($instance), '"'), ':')     )); } 
like image 102
Gordon Avatar answered Oct 02 '22 14:10

Gordon