2010-02-04 2 views
0

Ce que je voudrais faire est d'avoir une fonction d'usine statique que vous pouvez donner une série d'attributs et il retourne un objet qui est d'une classe précédemment non déclarée qui étend une classe connue.Comment créer une fabrique qui étend dynamiquement une classe afin que son type change mais hérite des méthodes parentes?

En gros:

<?php 
class foo { 
    public $a; 

    function increment($b = 1){ 
    $this->a += $b; 
    } 
} 

function factory($name, $a){ 
    //returns an object of class $name that extends foo with $this->a set to $a 
} 

de sorte que si j'écris le code:

<?php 
$bar = factory("bar",12); 
$bar->increment(5); 
print_r($bar); 
if(is_a($bar, "foo")){ 
    echo "is a Foo"; 
} 
$moo = factory("moo", 4); 
$moo->increment(); 
print_r($moo); 
if(is_a($moo, "foo")){ 
    echo "is a Foo"; 
} 

Je reçois: [modifier]

bar Object 
(
    [a] => 17 
) 
is a Foo 
moo Object 
(
    [a] => 5 
) 
is a Foo 

Mais je ne sais pas où pour commencer à chercher les commandes nécessaires pour le faire. Je pense que dans ma fonction d'usine, j'ai besoin de déclarer en quelque sorte que la valeur de $ name étend la classe parente mais ne fait aucun changement, puis construit un nouveau $ name. De cette façon, il a toutes les fonctionnalités de la classe parente, juste un type différent.

+0

Pour que cela soit clair: vous voulez que l'usine * crée * une ** classe ** entièrement nouvelle, puis instancie un objet? Ou en d'autres termes, vous voulez créer la classe ** à l'exécution. – Gordon

+0

À peu près oui, je voudrais définir la classe à l'exécution et l'avoir tous les mêmes méthodes et propriétés du parent. Et oui, je sais que c'est un peu fou. –

+1

Dans ce cas, utilisez la réponse de prodigitalson et jetez un oeil à http://github.com/sebastianbergmann/phpunit/blob/3.5/PHPUnit/Framework/MockObject/Generator.php – Gordon

Répondre

1

Jetez un coup d'œil sur l'API de réflexion de PHP, vous avez les méthodes dont vous avez besoin pour extraire et construire la nouvelle classe, mais comment y arriver et en créer une instance dont je ne suis pas sûr. Je sais que c'est possible parce que je suis assez sûr que c'est comme ça que fonctionne Mocking dans PHPUnit. Vous pouvez également regarder les différentes classes liées aux objets Mock dans PHPUnit pour obtenir quelques idées. Cela dit, à moins que vous n'ayez réellement ajouté/surchargé des méthodes, pourquoi voudriez-vous même faire cela? Pourquoi ne pas simplement utiliser une propriété dans l'objet ou utiliser une interface? Quel est le but ici?

Questions connexes