2008-09-23 8 views

Répondre

6

Vous pourriez avoir votre Les classes instanciées sont vides puis chargées par un nombre quelconque de méthodes. L'une de ces méthodes pourrait accepter une instance de la classe parente comme argument, puis copier ses données à partir de là

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

C'est plus de moins ma solution actuelle. Je suppose que je ne peux pas attendre d'autre magie pour faire ça. –

1

Je vous imagine qu'il avoir à inventer une sorte de "constructeur de copie". Ensuite, vous créez simplement un nouvel objet de sous-classe en transmettant l'objet original.

2

La meilleure méthode serait de créer une méthode clone sur la sous-classe afin que vous puissiez faire:

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

Sinon il semble que vous pouvez regarder dans le modèle décorateur php example

+0

pas aller pour PHP4, à moins que j'implémente moi-même clone –

3

Un objet php est pas beaucoup différent à un tableau, et puisque tout objet PHP 4 les variables sont publiques, vous pouvez faire des choses en désordre comme ceci:

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

ce ne est pas assez, et son certianly pas ce que je considère comme une bonne pratique, mais il est réutilisable, et il est très soigné .

5

Vous pouvez le faire avec un peu de magie noire, bien que je voudrais sérieusement pourquoi vous avez cette exigence en premier lieu. Cela suggère qu'il y a quelque chose qui ne va pas dans votre conception.

Néanmoins:

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])); 
} 

Ceci est soumis aux mêmes limitations que serialize en général, ce qui signifie que les références à d'autres objets ou ressources sont perdues.

+0

Sérieusement, cela fonctionne. Mais comment?! – Alfa

Questions connexes