2009-10-31 8 views
2

Je travaille actuellement sur une application oophp. J'ai une classe de site qui contiendra tous les paramètres de configuration pour l'application. À l'origine, j'allais utiliser le modèle singleton pour permettre à chaque objet de référencer une seule instance de l'objet site, mais principalement en raison des problèmes de test impliqués dans ce modèle, j'ai décidé d'essayer une approche différente.OOPHP alternative appropriée au modèle singleton?

Je voudrais faire de la classe de site la classe parente principale dans mon application et appeler son constructeur à partir des constructeurs des classes enfants, afin de rendre toutes les propriétés disponibles chaque fois que nécessaire.

Lors de son exécution pour la première fois, la classe contiendra uniquement les détails de la base de données pour l'application. Pour obtenir les valeurs restantes, une requête doit être effectuée en utilisant les détails de la base de données. Cependant, toutes les instances suivantes seront des clones de l'original (avec toutes les valeurs). Je peux également définir un indicateur booléen pour effectuer la requête à nouveau une instance complètement nouvelle est requise.

Serait-ce une alternative viable au singleton et résoudrait-il les problèmes de test qu'il provoque? Ceci est toute la théorie atm, je n'ai pas encore commencé à coder quoi que ce soit,

Toutes pensées ou conseils grandement appréciés. Merci.

+0

+1 ayant le même problème très souvent. Très intéressé d'entendre ce qui va se passer ici. –

+0

Quels sont les problèmes de test que vous rencontrez avec un singleton? –

+0

La technique ne fonctionne pas bien avec un accouplement lâche – Dan

Répondre

2

Je pense que le meilleur moyen est d'avoir un objet 'configuration' qui sera passé aux constructeurs de toutes vos autres classes. Donc, presque quelque chose comme un singleton, sauf qu'il est explicitement créé et transmis uniquement aux classes qui en ont besoin. Cette approche est généralement appelée dependency injection.

2

Après avoir essayé de nombreuses techniques différentes, ce que j'ai trouvé cette méthode est fiable et fonctionnel:

Utilisez un bootstrap ou un fichier d'initialisation. Il est situé dans la RACINE du site avec l'autorisation appropriée et des protections contre l'accès direct.

Toutes les pages du site incluent d'abord ce fichier. En son sein, je crée tous mes objets globaux (paramètres, utilisateur), et les référence à partir de là.

Par exemple:

// OBJECT CREATION 
$Config = new Configuration(); 
$User = new User(); 

Ensuite, dans les classes qui ont besoin de ces objets:

public function __construct($id = NULL) { 
    global $Config; // DEPENDENCY INJECTION SOUNDS LIKE AN ADDICTION! 

    if($Config->allow_something) { 
     $this->can_do_something = true; 
    } 

    if(NULL !== $id) { 
     $this->load_record($id); 
    } 
} 

Notez que je seulement l'accès à ces objets globaux à partir de la classe, et comment je ne pas avoir à inclure les variables d'objet en tant que premier paramètre de constructeur à chaque fois. Cela devient vieux.

De plus, avoir une classe de base de données statique a été très utile. Il n'y a pas d'objets que je dois s'inquiéter de passer, je peux juste appeler $row = DB::select_row($sql_statement);; consultez la classe PhpConsole.

MISE À JOUR Merci pour l'upvote, celui qui a fait cela. Cela a attiré l'attention sur le fait que ma réponse n'est pas quelque chose dont je suis fier. Bien que cela puisse aider le PO à accomplir ce qu'il voulait, ce n'est PAS une bonne pratique. Passer des objets à de nouveaux constructeurs d'objets est une bonne pratique (injection de dépendances), et bien que «gênant», comme pour d'autres choses dans la vie, l'effort supplémentaire en vaut la peine.

La seule partie de ma réponse qui est utilisée est l'utilisation du modèle de façade (par exemple, DB :: select_row()).Ce n'est pas nécessairement un singleton (ce que l'OP voulait éviter), et vous donne l'opportunité de présenter une interface allégée.

Laravel est un framework PHP moderne qui utilise l'injection de dépendances et les façades, entre autres modèles de design éprouvés. Je suggère que tout développeur novice passe en revue ces pratiques de conception ainsi que d'autres.