Я прочитал много предложений о том, как исправить неполные классы объектов, и мне действительно нужно было решить эти проблемы самостоятельно, в проекте электронной коммерции.
Одно предложение, которое я нашел, - просто использовать json_decode / json_encode для преобразования неполных классов без предварительной загрузки чего-либо. Однако я не хотел рисковать, используя это, если есть более старые версии PHP, которые зависят, например, от PECL, который описан в http://php.net/manual/en/function.json-encode.php - так что мне наконец удалось найти собственное решение. 1005 *
Однако код - это способ правильно извлечь данные из объекта, поэтому он может не соответствовать всем потребностям - и в первую очередь он будет использовать решение json в первую очередь, если оно доступно в среде и после сбоя к ручному обращению при необходимости.
Он также работает рекурсивно, что в моем случае требуется для сохранения всего массива.
/**
* Convert a object to a data object (used for repairing __PHP_Incomplete_Class objects)
* @param array $d
* @return array|mixed|object
*/
function arrayObjectToStdClass($d = array())
{
/**
* If json_decode and json_encode exists as function, do it the simple way.
* http://php.net/manual/en/function.json-encode.php
*/
if (function_exists('json_decode') && function_exists('json_encode')) {
return json_decode(json_encode($d));
}
$newArray = array();
if (is_array($d) || is_object($d)) {
foreach ($d as $itemKey => $itemValue) {
if (is_array($itemValue)) {
$newArray[$itemKey] = (array)$this->arrayObjectToStdClass($itemValue);
} elseif (is_object($itemValue)) {
$newArray[$itemKey] = (object)(array)$this->arrayObjectToStdClass($itemValue);
} else {
$newArray[$itemKey] = $itemValue;
}
}
}
return $newArray;
}