Невозможно воссоздать объект из данных var_exported (в PHP) - PullRequest
1 голос
/ 17 декабря 2011

Сценарий, запущенный на нашем работающем сервере, отправляет данные из следующей строки:

$log_output .= '<br>'.__LINE__.'<br>recordings_data='.var_export($recordings_data,TRUE);

, которая выглядит следующим образом:

recordings_data = stdClass :: __ set_state (массив('RecordingLongResponse' => массив (0 => stdClass :: __ set_state (...), 1 => stdClass :: __ set_state (), 2 => stdClass :: __ set_state (), 3 => stdClass :: __ set_state (массив)('roomStartDate' => '1321977120000', 'roomEndDate' => '1321977120000', 'recordingURL' => 'serverURL1', 'secureSignOn' => false, 'ID записи' => '1287268130290', 'creationDate' => '1321977120000 ',' recordingSize '=>' 6765975 ',' roomName '=>' Анализ заинтересованных сторон ',' sessionId '=>' 1287268130229 ',)), ...),))

Я не уверен, как «воссоздать» объект.Я попытался десериализовать это:

 $recording_data_ser= file_get_contents('elm-ser-data.txt'); // where I've saved everything after the '='
 $recording_data = unserialize($recording_data_ser);

Ответы [ 3 ]

4 голосов
/ 17 декабря 2011

serialize() и unserialize() являются общепринятыми методами для выгрузки / загрузки объектов PHP. Вы также можете сделать это с json_encode() и json_decode(). Есть ли причина, по которой вы хотите использовать var_export()?

Редактировать: вы можете только unserialize() результат serialize() - var_dump() в совершенно другом формате и не предназначен для импорта, если вы не используете eval().

Например:

$arr = array('foo' => 'bar');

var_export($arr);
#=> array (
#=>  'foo' => 'bar',
#=> )

echo serialize($arr);
#=> a:1:{s:3:"foo";s:3:"bar";}

echo json_encode($arr);
#=> {"foo":"bar"}

Как только вы получите сериализованные данные (через serialize() или json_encode()), вы можете использовать противоположный метод (unserialize() или json_decode(), соответственно), чтобы заново создать объект.

3 голосов
/ 17 декабря 2011

var_export () предназначен для выгрузки структуры данных в файл.Затем вам нужно eval() или include() или require() этот файл.Формат serialize () полностью отличается от var_export.

var_export создает действительный код PHP для определения структуры данных, как если бы вы сами выписали определение массива / объекта.сериализация / десериализация записи в совершенно другом формате, и они не являются взаимозаменяемыми.

2 голосов
/ 24 декабря 2013

Если вы вызываете var_export() для экземпляра stdClass, он пытается экспортировать его, используя ::__set_state(), который по некоторым причинам не реализован в stdClass.

Однако приведениеассоциативный массив к объекту обычно производит тот же эффект (по крайней мере, в моем случае).Поэтому я написал функцию improved_var_export() для преобразования экземпляров вызовов stdClass в (object) array ().Если вы решите экспортировать объекты любого другого класса, я бы посоветовал вам реализовать ::__set_state() в этих классах.

<?php
/**
 * An implementation of var_export() that is compatible with instances
 * of stdClass.
 * @param mixed $variable The variable you want to export
 * @param bool $return If used and set to true, improved_var_export()
 *     will return the variable representation instead of outputting it.
 * @return mixed|null Returns the variable representation when the
 *     return parameter is used and evaluates to TRUE. Otherwise, this
 *     function will return NULL.
 */
function improved_var_export ($variable, $return = false) {
    if ($variable instanceof stdClass) {
        $result = '(object) '.improved_var_export(get_object_vars($variable), true);
    } else if (is_array($variable)) {
        $array = array ();
        foreach ($variable as $key => $value) {
            $array[] = var_export($key, true).' => '.improved_var_export($value, true);
        }
        $result = 'array ('.implode(', ', $array).')';
    } else {
        $result = var_export($variable, true);
    }

    if (!$return) {
        print $result;
        return null;
    } else {
        return $result;
    }
}

// Example usage:
$obj = new stdClass;
$obj->test = 'abc';
$obj->other = 6.2;
$obj->arr = array (1, 2, 3);

improved_var_export((object) array (
    'prop1' => true,
    'prop2' => $obj,
    'assocArray' => array (
        'apple' => 'good',
        'orange' => 'great'
    )
));

/* Output:
(object) array ('prop1' => true, 'prop2' => (object) array ('test' => 'abc', 'other' => 6.2, 'arr' => array (0 => 1, 1 => 2, 2 => 3)), 'assocArray' => array ('apple' => 'good', 'orange' => 'great'))
*/

// Example implementation in context of OP
$export = improved_var_export($data, true);
file_put_contents(dirname(__FILE__).'/data.php', '<'.'?php return '.$export.'; ?'.'>');

// "Unserialization" (evaluation)
$import = include dirname(__FILE__).'/data.php';
?>
...