2010-10-31 12 views
1

Je me demande quel est le plus optimal sur le plan sémantique et technique de mes choix ici. J'ai créé une classe de registre d'objets simple, mais la méthode d'accès aux objets me demande ce qu'il y a de mieux. J'utilise actuellement la première variante:Choix de syntaxe pour accéder aux objets enfants

//the Registry methods can chain, each returning a self reference 
$registry = Registry::getInstance()->register('myObject', new Object); 

//accessing a registered object method 
//in various possible ways 
Registry::getInstance()->myObject->method();  //1 
Registry::getInstance()->use('myObject')->method(); //2 
$registry('myObject')->method();     //3 
  • La première variante utilise __get() magique, conformément à la syntaxe couramment.
  • La seconde utilise la méthode 'getter' use().
  • Le troisième utilise la magie __invoke(), qui a été suggérée, mais je ne l'aime pas trop.

Je suis juste curieux de savoir si quelqu'un a un aperçu, ou des suggestions pour utiliser n'importe laquelle (ou aucune) de ces options. La raison d'utiliser une classe de registre dans mon cas est de fournir pseudo-globalisation des objets clés, pour une utilisation dans les fermetures imbriquées (en les déclarant avec use chaque fois est lourd)

Ceci est un peu lié à mon autre question, à PHP closures and implicit global variable scope

Merci à l'avance :)

+1

Une autre option qui serait plutôt sympa serait d'implémenter l'interface ArrayAccess afin que vous puissiez utiliser $ registry ['myObject'] -> method(); '. Cependant, pour des raisons d'efficacité, vous voudriez mettre en cache 'myObject' si vous deviez effectuer plusieurs opérations dessus, par exemple. '$ myObject = $ registry ['monObjet'];' – connec

Répondre

1

Mon opinion personnelle est d'utiliser une combinaison de votre 2ème et 3ème exemple de code. En utilisant les deux (ou seulement votre 2ème exemple) vous pouvez utiliser phpDoc pour maintenir l'auto-complétion.

Voici un exemple:

<?php 

class Session { 
    public function register() { 
    } 
} 

/** 
* @property Session $session 
*/ 
class Registry { 
    private $_classes = array(); 

    public function __set($key, $value) { 
     $key = (string) $key; 
     if ((null === $value) && isset($this->_classes[$key])) { 
      unset($this->_classes[$key]); 
     } elseif (null !== $value) { 
      $this->_classes[$key] = $value; 
     } 
    } 

    public function __get($key) { 
     $key = (string) $key; 
     if (isset($this->_classes[$key])) { 
      return $this->_classes[$key]; 
     } 

     switch ($key) { 
      case 'session': 
       $this->_classes[$key] = new Session(); 
       break; 
     } 

     return $this->_classes[$key]; 
    } 
} 

$registry = new Registry(); 
$registry->session->register(); 

Si je vous donner un indice pourquoi mon registre de classe ne suit pas le singleton motif ... évitez d'utiliser le singleton-modèle si vous voulez exécuter UNIT- tests. Voir ici: http://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html

Questions connexes