He leído un montón de sugerencias sobre cómo solucionar classobjects incompletas y que en realidad tenía que solucionar esos problemas a mí mismo, en un proyecto de comercio electrónico.
Una sugerencia que he encontrado es simplemente usar json_decode/json_encode para convertir clases incompletas sin precargar nada. Sin embargo, no quería correr el riesgo de usar esto, si hay versiones anteriores de PHP que son dependientes, por ejemplo, PECL, que se describe en http://php.net/manual/en/function.json-encode.php, así que finalmente tuve éxito en hacer mi propia solución.
Sin embargo, el código es una forma de sacar los datos del objeto correctamente, por lo que puede no ajustarse a todas las necesidades, y utilizará primero la solución json, si está disponible en el entorno y falla a la manipulación manual si es necesario.
También funciona recursivamente, que en mi caso es necesario, para guardar toda la matriz.
/**
* 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;
}
En ese segundo trozo de código, ¿quiso decir fixObject en lugar de fixclass? Podría ser confuso – Cyprus106
también podría usar el autocargador para cargar la clase, lo que haría que todo el problema desaparezca. – StasM
después de haber sido deserializado, todavía no puedo acceder a las propiedades, pero foreach está bien para mí. – Sithu