-
-
Save luckydonald/1c50b497a8f92ed429ad99de01920fb7 to your computer and use it in GitHub Desktop.
PHP function to cast an object from one class to another.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Cast an object into a different class. | |
* | |
* Currently this only supports casting DOWN the inheritance chain, | |
* that is, an object may only be cast into a class if that class | |
* is a descendant of the object's current class. | |
* | |
* This is mostly to avoid potentially losing data by casting across | |
* incompatable classes. | |
* | |
* @param object $object The object to cast. | |
* @param string $class The class to cast the object into. | |
* @return object | |
*/ | |
function cast($object, $class) { | |
if( !is_object($object) ) | |
throw new InvalidArgumentException('$object must be an object.'); | |
if( !is_string($class) ) | |
throw new InvalidArgumentException('$class must be a string.'); | |
if( !class_exists($class) ) | |
throw new InvalidArgumentException(sprintf('Unknown class: %s.', $class)); | |
if( !is_subclass_of($class, get_class($object)) ) | |
throw new InvalidArgumentException(sprintf( | |
'%s is not a descendant of $object class: %s.', | |
$class, get_class($object) | |
)); | |
/** | |
* This is a beautifully ugly hack. | |
* | |
* First, we serialize our object, which turns it into a string, allowing | |
* us to muck about with it using standard string manipulation methods. | |
* | |
* Then, we use preg_replace to change it's defined type to the class | |
* we're casting it to, and then serialize the string back into an | |
* object. | |
*/ | |
return unserialize( | |
preg_replace( | |
'/^O:\d+:"[^"]++"/', | |
'O:'.strlen($class).':"'.$class.'"', | |
serialize($object) | |
) | |
); | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment