2008-09-23 13 views

Respuesta

6

que podría tener su clases instanciadas vacías y luego cargadas por cualquier cantidad de métodos. Uno de estos métodos podrían aceptar una instancia de la clase padre como un argumento y, a continuación, copiar los 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); 
+0

Esto es más o menos mi solución actual. Supongo que no puedo esperar otra magia para hacer esto. –

1

me podría imaginar que habría tiene que inventar algún tipo de "constructor de copia". Entonces solo crearías un nuevo objeto de subclase mientras pasabas el objeto original.

2

El mejor método sería crear un método clone en la Subclase de manera que se podía hacer:

$myvar = $subclass->clone($originalObject) 

Alternativamente parece que usted podría mirar en el patrón decorador php example

+0

No va para PHP4, a menos que implemente clonar yo mismo –

3

Un objeto PHP no es mucho diferente de una matriz, y puesto que todos los objetos de PHP 4 las variables son públicas, puede hacer algunas cosas desordenado como esto:

function clone($object, $class) 
{ 
    $new = new $class(); 
    foreach ($object as $key => $value) 
    { 
      $new->$key = $value; 
    } 
    return $new; 
} 
$mySubclassObject = clone($myObject, 'mySubclass'); 

no es bonita, y su claro que no es lo que yo consideraría como una buena práctica, pero es reutilizable, y es bastante limpio .

5

Puedes hacerlo con un poco de magia negra, aunque en serio preguntaría por qué tienes este requisito en primer lugar. Sugiere que hay algo muy mal con su diseño.

No obstante:

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 serialize en general, lo que significa que las referencias a otros objetos o recursos se pierden.

+0

En serio, funciona. ¡¿Pero cómo?! – Alfa

Cuestiones relacionadas