serializar - ¿Cómo se copia un objeto PHP en un tipo de objeto diferente?
serializar un objeto php (5)
El mejor método sería crear un método de clonación en la Subclase para que usted pueda:
$myvar = $subclass->clone($originalObject)
Alternativamente, suena como si pudieras mirar en el patrón de decorador php example
Nueva clase es una subclase del objeto original
Necesita ser compatible con php4
Me imagino que tendrías que inventar una especie de "constructor de copias". Entonces solo crearías un nuevo objeto de subclase mientras pasabas el objeto original.
Podría hacer que sus clases crearan una instancia vacía y luego cargarse por cualquier cantidad de métodos. Uno de estos métodos podría aceptar una instancia de la clase padre como argumento y luego copiar sus datos desde allí
class childClass extends parentClass
{
function childClass()
{
//do nothing
}
function loadFromParentObj( $parentObj )
{
$this->a = $parentObj->a;
$this->b = $parentObj->b;
$this->c = $parentObj->c;
}
};
$myParent = new parentClass();
$myChild = new childClass();
$myChild->loadFromParentObj( $myParent );
Puedes hacerlo con un poco de magia negra, aunque me preguntaría seriamente por qué tienes este requisito en primer lugar. Sugiere que hay algo muy mal con su diseño.
Sin embargo:
function change_class($object, $new_class) {
preg_match(''~^O:[0-9]+:"[^"]+":(.+)$~'', serialize($object), $matches);
return unserialize(sprintf(''O:%s:"%s":%s'', strlen($new_class), $new_class, $matches[1]));
}
Esto está sujeto a las mismas limitaciones que serializar en general, lo que significa que las referencias a otros objetos o recursos se pierden.
Un objeto php no es muy diferente de una matriz, y como todas las variables de objeto PHP 4 son públicas, puedes hacer algunas cosas desordenadas como esta:
function clone($object, $class)
{
$new = new $class();
foreach ($object as $key => $value)
{
$new->$key = $value;
}
return $new;
}
$mySubclassObject = clone($myObject, ''mySubclass'');
No es bonito, y ciertamente no es lo que yo considero una buena práctica, pero es reutilizable, y es bastante limpio.