Я пишу модуль для php cms. В функции (обратный вызов) я могу получить доступ к объекту, который прибывает из кода платформы.
Этот объект имеет тип __PHP_Incomplete_Class
потому что необходимый заголовочный файл не включен, прежде чем сессия запускается. Я не могу включать его, не взламывая ядро cms код.
Интересно, ли possibile для доступа к свойствам объектов так или иначе (бросающий для выстраивания, не работает). Я спрашиваю это, потому что я вижу значения с var_dump()
но использование $object->var
Я всегда добираюсь, аннулирует.
Эта проблема возникает при отмене сериализации объекта класса, который еще не был включен. Например, если вы вызываете session_start перед включением класса.
К объекту PHPIncompleteClass нельзя получить доступ напрямую, но это нормально с foreach, serialize и gettype. Вызов is_object с объектом PHPIncompleteClass приведет к false.
Итак, если вы обнаружите в своем сеансе объект '__PHP_Incomplete_Class' и включили свой класс после session_load, вы можете использовать эту функцию:
function fixObject (&$object)
{
if (!is_object ($object) && gettype ($object) == 'object')
return ($object = unserialize (serialize ($object)));
return $object;
}
Это приведет к пригодный для использования объект:
fixObject($_SESSION['member']);
Я нашел этот хак, который позволит вам создать объект:
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 /
Таким образом, вы можете:
$obj = casttoclass('stdClass', $incompleteObject);
и затем получить доступ к свойствам как обычно.
Вы также можете определить unserialize_callback_func
в файле конфигурации .htaccess / Apache. Таким образом, вам не нужно будет взламывать какой-либо PHP, но вы можете включить файл по запросу.