2010-09-13 15 views
2

J'ai une application web où j'utilise une classe de registre. La classe de registre contient des classes importantes dont j'ai besoin dans ma demande.Création d'une bonne classe de registre en PHP pour les classes importantes

J'ai fait de la classe de registre une classe Singleton et cette classe est statique.

Le contenu de la classe de registre est ici:

<?php 
class registry 
{ 
    private static $objects = array(); 
    private static $instance; 

    private function __construct(){} 
    private function __clone(){} 

    public static function singleton() 
    { 
     if(!isset(self::$instance)) 
     { 
      self::$instance = new registry(); 
     } 
     return self::$instance; 
    } 

    public function storeObjects() 
    { 
     $Objects = array_merge($GLOBALS['EXTRA_LIBS'],array('data','page','session','uri','loader','modules')); 

     foreach($Objects as $name) 
     { 
      $this->$name = $name; 
     } 
    } 

    public function __set($object, $key) 
    { 
     require_once(__LIBRARIES . DS . $object . '.class.php'); 
     self::$objects[ $key ] = new $object(self::$instance); 
    } 

    public function __get($key) 
    { 
     if(is_object (self::$objects[ $key ])) 
     { 
      return self::$objects[ $key ]; 
     } 
    } 

    public function returnAllObjects() 
    { 
     return self::$objects; 
    } 
} 
?> 

Maintenant, chaque fois que je veux utiliser l'une des classes ici dans ma demande que je fais:

registry::singleton()->data->adddata('somedata'); 

J'utilise les classes beaucoup dans ma demande, minimum 1 fois dans chaque méthode.

Maintenant, ma question est quelle est la meilleure chose à faire:

1) appeler la chose à chaque fois que

2) Classe $registry = registry::singleton(); une fois dans chaque méthode, puis il suffit d'utiliser la variable locale. (Je ne sais pas si cela va fonctionner)

Ou y at-il une méthode plus élégante pour résoudre ce problème.

Répondre

2

L'affectation ou non de l'instance de registre à une variable locale est sans importance. Si c'est votre seule préoccupation, utilisez ce qui rend le code plus lisible dans le bloc de code spécifique. Je serais plus préoccupé par les implications de devoir coder en dur le nom de classe Registry dans mes autres classes et si j'ai vraiment besoin d'un Singleton pour le Registre. Jetez un oeil à Dependency Injection.

+0

+1 pour l'injection de dépendance –

0

(2) fonctionnerait très bien, essayez-le. Si vous l'utilisez plusieurs fois dans chaque méthode, cela vous évitera de taper du texte.

Vous pourriez envisager d'ajouter un peu de raison dans la vérification __set() pour vérifier que le fichier existe avant require_once, ainsi que l'exploitation forestière et/ou de renvoyer une erreur si elle ne le fait pas (même pour __get()).