Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Cast Objects in PHP

Ive some classes that share some attributes, and i would like to do something like:

$dog = (Dog) $cat; 

is it possible or is there any generic work around?

Its not a superclass, or a interface or related in any way. They are just 2 different classes i would like php map the attributes from a cat class to a dog and give me the new object. –

i guess i have to specify a little bit more cause seem like a senseless thing to do.

i've classes that inherits from different parent classes cause i've made an inheritance tree based on the saving method, maybe my bad from the beginning, but the problem is that i have a lot of classes that are practically equal but interacts one with mysql and the other one with xml files. so i have:

class MySql_SomeEntity extends SomeMysqlInteract{} 

and

Xml_SomeEntity extends SomeXmlInteract{} 

its a little bit deeper tree but the problem its that. i cant make them inherits from the same class cause multiple inheritance is not allowed, and i cant separate current interaction with superclases cause would be a big trouble.

Basically the attributes in each one are practical the same.

since i have a lot of this matching classes i would like to do some generic casting or something like it that can converts (pass the values to each attribute) and but im trying to search the simplest way to everyone of this classes.

like image 651
user267599 Avatar asked Feb 09 '10 01:02

user267599


People also ask

Does PHP support type casting?

Type casting in PHP works same as C programming. Desired data type name with parenthesis before the variable which we need to cast. For example, if we need to cast the string to the integer then below will work: <?

How do you object in PHP?

To create an Object in PHP, use the new operator to instantiate a class. If a value of any other type is converted to an object, a new instance of the stdClass built-in class is created.


2 Answers

You can use above function for casting not similar class objects (PHP >= 5.3)

/**  * Class casting  *  * @param string|object $destination  * @param object $sourceObject  * @return object  */ function cast($destination, $sourceObject) {     if (is_string($destination)) {         $destination = new $destination();     }     $sourceReflection = new ReflectionObject($sourceObject);     $destinationReflection = new ReflectionObject($destination);     $sourceProperties = $sourceReflection->getProperties();     foreach ($sourceProperties as $sourceProperty) {         $sourceProperty->setAccessible(true);         $name = $sourceProperty->getName();         $value = $sourceProperty->getValue($sourceObject);         if ($destinationReflection->hasProperty($name)) {             $propDest = $destinationReflection->getProperty($name);             $propDest->setAccessible(true);             $propDest->setValue($destination,$value);         } else {             $destination->$name = $value;         }     }     return $destination; } 

EXAMPLE:

class A  {   private $_x;    }  class B  {   public $_x;    }  $a = new A(); $b = new B();  $x = cast('A',$b); $x = cast('B',$a); 
like image 67
Adam Puza Avatar answered Oct 13 '22 14:10

Adam Puza


There is no built-in method for type casting of user defined objects in PHP. That said, here are several possible solutions:

1) Use a function like the one below to deserialize the object, alter the string so that the properties you need are included in the new object once it's deserialized.

function cast($obj, $to_class) {   if(class_exists($to_class)) {     $obj_in = serialize($obj);     $obj_out = 'O:' . strlen($to_class) . ':"' . $to_class . '":' . substr($obj_in, $obj_in[2] + 7);     return unserialize($obj_out);   }   else     return false; } 

2) Alternatively, you could copy the object's properties using reflection / manually iterating through them all or using get_object_vars().

This article should enlighten you on the "dark corners of PHP" and implementing typecasting on the user level.

like image 44
user250120 Avatar answered Oct 13 '22 16:10

user250120