Есть объекты, которые строятся в одной системе. Они могут быть как большими, так и маленькими, очень вложенными и не очень.
Мне необходимо каким-то образом сохранить их в файлы, чтобы затем в другом проекте кто-то взял и написал что-то типа.
$model = require 'path/to/model';
И работал с ним, как с тем самым объектом.
Пока я придумал сохранять их в json файлы, и в другом проекте делать
$json = file_get_contents('path/to/json');
$model = json_decode($json);
Но минус подхода в том, что на выходе все будет объектами. Даже то, что было до этого массивами. А мне важно получить такую же модель как была изначально.
P.S. Вообще эти объекты есть модели представления, которые уходят во вьюхи. Мы хотим отдавать их верстальщику, чтобы он на их основе верстал страницы без необходимости поднимать у себя весь проект.
В данном случае при использовании нативной php шаблонизации важно сохранить массив массивом, а объект объектом, т.к. обращения к ним по разному происходит, поэтому подошел вариант с serialize/unserialize.
php.net/manual/ru/function.serialize.php
UPD.1 Если делать unserialize в системе, где не объявлены сериализованные объекты, они после unserialize станут объектами класса __PHP_Incomplete_Class. Получить доступ к свойствам такого объекта не представляется возможным, хотя var_dump выводит их все.
Для решения этой ситуации был написан небольшой хелпер.
Смысле его в приведении таких проблемных объектов к классу stdClass.
class DataHelper
{
public static $basePath;
public static function getViewData($name)
{
$serializedData = file_get_contents(self::$basePath.'/'.$name.'.php');
$data = unserialize($serializedData, ['allowed_classes' => false]);
return self::fixObjects($data);
}
public static function fixObjects($data)
{
if (is_array($data)) {
foreach($data as $key=>$value) {
$data[$key] = self::fixObjects($value);
}
}
if (gettype($data) == 'object' && get_class($data) == '__PHP_Incomplete_Class') {
$data = self::castToClass('stdClass', $data);
$vars = get_object_vars($data);
foreach($vars as $varName => $varValue) {
$data->{$varName} = self::fixObjects($varValue);
}
}
return $data;
}
public static function castToClass($class, $object)
{
return unserialize(preg_replace('/^O:\d+:"[^"]++"/', 'O:' . strlen($class) . ':"' . $class . '"', serialize($object)));
}
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей