tags:

views:

1182

answers:

3

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.

+4  A: 

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.

Tom Haigh
Neat. I just love doing hacky stuff like that ;)
n3rd
clever but "hackish" :] I thought about eval(something) at first.
gpilotino
Thanks for posting! Note: it should be casttoclass('stdClass', $incompleteObject).
Langdon
@Langdon: Thanks, corrected
Tom Haigh
I'm having this problem, and can't seem to implement this fix. I'm saving a serialized return object from the Ebay api, and now cannot access sub classes.
DavidYell
+6  A: 

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 :

fixclass($_SESSION['member']);
A: 

Use an Autoloader to avoid this mistake.

PHP Autoloader