2010-01-20 5 views
3

En PHP si je crée une méthode singleton pour comme 5 différentes classes de mise en cache (memcache, apc, session, fichier, cookies)Est-il mauvais d'appeler une méthode singleton plusieurs fois encore et encore sur une page en PHP?

J'ai une principale classe de cache qui basiquement itinéraires mon set() et get() méthodes à la classe de mise en cache appropriée. Maintenant, disons que je dois utiliser la session, le cookie, le memcache et le cache de fichiers sur la même page. Ma classe de cache principale devrait alors créer une nouvelle instance 1 fois pour chacun de ces types de cache en utilisant un singleton. Je devrais alors appeler mes méthodes singleton plusieurs fois sur une page, si je devais définir/obtenir 30 appels différents au cache sur une page, il appellerait la méthode singleton plusieurs fois.

Je me demande si c'est une mauvaise pratique ou pas très bon de continuer à appeler mon singleton encore et encore sur une page?


MISE À JOUR

Ci-dessous est un code que j'ai commencé, dans ce que vous pouvez obtenir un meilleur exemple de ce que je suis en train de faire ... Si je devais ajouter quelque chose à memcache 40 fois sur une page, il appellerait la méthode singleton pour la classe YM memcache 40 fois

/** 
* Set a key/value to cache system. 
* 
* @param string  type of cache to store with 
* @param string|array keys, or array of values 
* @param mixed   value (if keys is not an array) 
* @return void 
*/ 
public function set($type, $keys, $value = FALSE, $options_arr) 
{ 
    if (empty($keys)) 
     return FALSE; 

    if (! is_array($keys)) 
    { 
     $keys = array($keys => $val); 
    } 

    // Pick our Cache system to use 
    switch ($type) { 
     case "memcache": 
      // Cache item to memcache 
      $this->memcache = Memcache::getInstance(); 
      $this->memcache->get($keys, $value, $options); 
      break; 

     case "apc": 
      // Cache item to APC 
      $this->apc = APC::getInstance(); 
      $this->apc->get($keys, $value, $options); 
      break; 

     case "session": 
      // Cache item to Sessions 
      foreach ($keys as $key => $val) 
      { 
       // Set the key 
       $_SESSION[$key] = $val; 
      } 
      break; 

     case "cookie": 
      // Cache item to Cookie 
      break; 

     case "file": 
      // Cache item to File 
      break; 
    } 

} 

Répondre

3

d'une manière générale, l'utilisation des singletons est de plus en plus considéré comme une mauvaise pratique (une des raisons est qu'ils font tester unité plus difficile, si pas impossible). Pour illustrer cela: symfony et Zend Framework, pour leur prochaine version majeure (2.0), essaient de supprimer autant de singletons que possible des deux frameworks. Cela étant dit, les singletons doivent être utilisés lorsqu'il est logique d'avoir une seule instance d'une classe donnée; cela a-t-il du sens dans votre cas? À vous de décider ;-)

Si vous ne voulez pas appeler votre singleton encore et encore, vous voudrez peut-être le stocker dans une variable locale - je suppose que cela peut être considéré comme une sorte de (peut-être «prématurée»/«inutile») optimisation.

Par exemple, au lieu si avoir ce genre de code:

Singleton::getInstance()->method(); 
Singleton::getInstance()->method(); 
Singleton::getInstance()->method(); 

Vous auriez:

$s = Singleton::getInstance(); 
$s->method(); 
$s->method(); 
$s->method(); 

Je ne sais pas combien vous gagnerez de cela, mais ...

+0

Ouais c'est là où je suis coincé, certaines personnes disent que beaucoup d'objets sont bons mais je ne comprends pas. Actuellement, je crée 1 objet de base de données sur une page et faire toutes les requêtes de 1, tous les objets de session, je tiens à 1 je n'ai pas vraiment appris sur les objets assez pour comprendre pourquoi vous voulez plus de 1 – JasonDavis

+0

comme ce serait mieux peut-être au moins mais je suppose que c'est difficile à dire. Aussi, j'aimerais voir quelles sont les alternatives utilisées par symfony et Zend Framework pour les singletons – JasonDavis

+0

"One object" ou "several objects"?Eh bien, cela dépend de la situation ;-) ;; Pour une connexion à une base de données, vous voulez probablement une et une seule connexion: pas besoin de se connecter au même DB plus d'une fois - ce qui signifie pas besoin de plus d'une instance de votre classe 'Database_Connection' ;; Pour certains "utilisateur" classe, vous pouvez probablement avoir plus d'un utilisateur dans votre application - ce qui signifie que plus d'une instance de 'User' est probablement parfaitement normal. –

Questions connexes