forcing access to __PHP_Incomplete_Class object properties
I'm writing a module for a php cms. In a function (a callback) I can access an object that comes from the framework code.
This object is of type __PHP_Incomplete_Class
because the needed header file is not included before the session starts. I cannot include it without hacking the core cms code.
I wonder if is possibile to access the object properties anyway (casting to array does not work). I ask this because I can see the values with var_dump()
but using $object->var
I always get nulls.
This issue appends when you un serialize an object of a class that hasn't been included yet. For exemple, if you call session_start before include the class.
A PHPIncompleteClass object can't be accessed directly, but it's ok with foreach, serialize and gettype. Calling is_object with an PHPIncompleteClass object will result false.
So, if you find a '__PHP_Incomplete_Class' object in your session and you've included your class after the session_load, you can use this function :
function fixObject (&$object)
{
if (!is_object ($object) && gettype ($object) == 'object')
return ($object = unserialize (serialize ($object)));
return $object;
}
This will results a usable object :
fixObject($_SESSION['member']);
I found this hack which will let you cast an object:
function casttoclass($class, $object)
{
return unserialize(preg_replace('/^O:\d+:"[^"]++"/', 'O:' . strlen($class) . ':"' . $class . '"', serialize($object)));
}
From http://blog.adaniels.nl/articles/a-dark-corner-of-php-class-casting/
So you can do:
$obj = casttoclass('stdClass', $incompleteObject);
and then access properties as normal.
You could also define an unserialize_callback_func
in a .htaccess/Apache configuration file. That way you wouldn't need to hack any PHP but you could include the file on demand.