Aujourd'hui, je vais vous présenter le prochain modèle de conception structurelle sur le site Web chinois PHP - le mode arborescence d'enregistrement, le mode d'enregistrement d'alias ou le mode d'enregistrement, qui est utilisé pour enregistrer des instances d'objets fréquemment utilisés dans les programmes. Le mode arborescence d'enregistrement enregistre les instances d'objet dans une arborescence d'objets globale et les sélectionne dans l'arborescence d'objets si nécessaire. Mais contrairement à la cueillette dans la réalité, les fruits cueillis sur l’arbre cible existent toujours sur l’arbre cible et vous pourrez continuer à les cueillir la prochaine fois.
Code d'implémentation
Le modèle de registraire est très facile à comprendre et à mettre en œuvre. Généralement, un attribut sera utilisé pour stocker plusieurs instances d'objet, ainsi que des méthodes set et get. La méthode set est utilisée pour enregistrer l'instance d'objet dans le tableau d'attributs et la méthode get est utilisée pour obtenir l'instance d'objet souhaitée.
class Registry { // 保存实例对象 private static $objs = []; // get获取实例对象 public static function get(string $alias) : Object { if (!isset(self::$objs[$alias])) { throw new \Exception($alias . 'not found'); } return self::$objs[$alias]; } // set将实例对象注册到属性$objs中 public static function set (string $alias, Object $obj) : void { if (!isset(self::$objs[$alias])) { self::$objs[$alias] = $obj; } } // 注销实例 public static function unset (string $alias) :void { if (isset(self::$objs[$alias])) { unset(self::$objs[$alias]); } } }
Utilisez le mode arbre d'enregistrement et le mode usine au lieu du mode singleton
Nous savons que le singleton est très utile et peut éviter le gaspillage de ressources, etc. Cependant, le modèle singleton a été considéré comme un modèle négatif et il est considéré comme difficile de tester et de maintenir le modèle singleton. Quant à savoir pourquoi le modèle singleton est considéré comme un anti-modèle, je n'entrerai pas dans les détails ici. Les amis intéressés peuvent le rechercher eux-mêmes sur Google.
Alors, existe-t-il d'autres moyens de garantir un singleton sans utiliser le modèle singleton ? Oui, nous pouvons utiliser le mode arbre d'enregistrement et le mode usine pour remplacer le mode singleton. Voici le code spécifique :
class Registry { // 保存实例对象 private static $objs = []; // get获取实例对象 public static function get(string $alias) { if (!isset(self::$objs[$alias])) { return null; } return self::$objs[$alias]; } // set将实例对象注册到属性$objs中 public static function set (string $alias, Object $obj) : void { if (!isset(self::$objs[$alias])) { self::$objs[$alias] = $obj; } } // 注销实例 public static function unset (string $alias) :void { if (isset(self::$objs[$alias])) { unset(self::$objs[$alias]); } } } class DbFactory { const ALIAS = 'Db'; public static function create () { $db = Registry::get(self::ALIAS); if (!$db) { $db = new Db([ 'host' => 'localhost', 'user' => 'root', 'pass' => '', 'db_name' => 'test' ]); Registry::set(self::ALIAS, $db); } return $db; } }
Lorsque nous avons besoin d'une instance Db, il suffit d'appeler DbFactory::create. Cette méthode garantit un singleton. Voici le code de test :
$db = DbFactory::create(); var_dump($db);
Recommandations associées :
1.Modèle de conception PHP modèle d'usine simple
2 . Comprendre l'usine simple, la méthode d'usine, l'usine abstraite dans un article
3.Comprendre le modèle de proxy du modèle de conception PHP dans un article
4.Modèle de conception PHP : expérience d'apprentissage en mode pont (avec code de cas)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!