принуждение доступа к __ свойства объектов PHP_Incomplete_Class

Я пишу модуль для php cms. В функции (обратный вызов) я могу получить доступ к объекту, который прибывает из кода платформы.

Этот объект имеет тип __PHP_Incomplete_Class потому что необходимый заголовочный файл не включен, прежде чем сессия запускается. Я не могу включать его, не взламывая ядро cms код.

Интересно, ли possibile для доступа к свойствам объектов так или иначе (бросающий для выстраивания, не работает). Я спрашиваю это, потому что я вижу значения с var_dump() но использование $object->var Я всегда добираюсь, аннулирует.

32
задан Mike Mackintosh 2 January 2013 в 16:23
поделиться

2 ответа

Эта проблема возникает при отмене сериализации объекта класса, который еще не был включен. Например, если вы вызываете 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']);
60
ответ дан 27 November 2019 в 20:10
поделиться

Я нашел этот хак, который позволит вам создать объект:

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, но вы можете включить файл по запросу.

18
ответ дан 27 November 2019 в 20:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: