2010-04-20 13 views
0

J'ai des difficultés à trouver comment implémenter un comportement 'configurable' dans une classe d'usine en PHP.Implémentation d'une fabrique configurable

J'ai en classe, qui prend une autre classe comme argument dans son constructeur. La classe d'argument pourrait prendre un certain nombre d'arguments dans son constructeur. Une instance de ma classe principale pourrait ressembler à ceci

$instance = new MyClass(new OtherClass(20, true)); 
$instance2 = new MyClass(new DifferentClass('test')); 

Ceci est plutôt maladroit et a un certain nombre de problèmes et donc je voudrais passer cela dans une classe d'usine. Le problème est que cette fabrique a besoin de savoir comment instancier la classe d'argument, car cette classe peut avoir un nombre quelconque d'arguments dans le constructeur.

De préférence, je voudrais être en mesure de faire quelque chose comme ça

$instance = Factory::build('OtherClass'); 
$instance2 = Factory::build('DifferentClass'); 

Et que l'usine récupérer les arguments à partir d'un tableau de configuration ou similaire.

+0

Si vous essayez de créer une classe d'usine flexible, je pense que vous devriez viser l'usine sans se soucier de la classe qu'elle contrôle. Il devrait simplement viser à contrôler quand et comment les choses sont créées, ces propriétés devraient être contrôlables bien sûr. Mais l'usine ne devrait pas faire de voiture si elle crée des "chats" "super-complexes-structures" "autresfactorys" – thecoshman

Répondre

1

Si vous stockez la liste des classes et leurs arguments constructeur en tant que tableau. Quelque chose comme:

array(
    'OtherClass' => array(20, true), 
) 

Vous pouvez alors construire la classe en utilisant la reflection api et la fonction newInstanceArgs.

+0

C'était exactement ce que je cherchais. Je suis déjà en train d'utiliser la réflexion api dans d'autres parties du code, donc ça marche super bien. Merci! – Decko