Maison >développement back-end >tutoriel php >Injection de dépendances DI et implémentation singleton de phalapi
Je pense que beaucoup de gens connaissent le modèle d'intérêt simple et l'injection de dépendances. Cet article explique principalement l'injection de dépendances DI et le mode singleton de phalapi. Les étudiants intéressés par l'injection de dépendances et le mode singleton peuvent y jeter un œil.
1. Mode Singleton
Le mode singleton ne devrait pas être étranger aux enfants qui font de la programmation orientée objet depuis longtemps. Les enfants qui apprennent le PHP devraient également en avoir entendu parler. Voici une brève discussion. Parlons de ce qu'est le modèle singleton, des problèmes qu'il résout et de la manière dont il est implémenté dans PhalApi.
Singleton Singleton, le soi-disant singleton signifie qu'il n'y a qu'une seule existence. , c'est le singleton. Par exemple, il n'est pas difficile de voir ses avantages car il utilise moins de ressources car il n'y en a qu'une. Tout le monde sait que pour utiliser une classe, il faut avoir une instance, qui est nouvelle à chaque fois. new, une zone sera générée dans la mémoire pour stocker l'instance. Si beaucoup de new est utilisé pour instancier le même objet en une seule exécution du programme, il consommera plus de ressources. Cependant, s'il s'agit d'un programme universel qui utilise. variables globales, ce sera inélégant et compliqué. Dans ce cas, le mode singleton est né
Le mode singleton est une méthode qui a le meilleur des deux mondes. être utilisé globalement, deuxièmement, il n'y a pas lieu de s'inquiéter d'occuper trop de ressources, et troisièmement, c'est très élégant. Voyons comment le modèle singleton est implémenté dans PhalApi :
//大家看到我们常用的DI方法内部实现的是PhalApi_DI中的静态方法one方法 function DI() { return PhalApi_DI::one(); }
Ensuite. nous regardons à l'intérieur de la seule méthode
Chaque fois que nous Lorsque la demande arrive, vérifiez d'abord si l'instance de variable statique n'a pas été initialisée. S'il s'agit du premier appel, elle le sera. instancions la classe PhalApi_DI en interne, puis donnez une valeur négative à $instance puis renvoyons la variable statique de l'instance lorsque nous l'appelons la prochaine fois. Lorsque la requête arrive, cette variable statique a été instanciée et elle ignorera directement le processus d'instanciation. et renvoie l'objet directement. Autrement dit, la méthode DI que nous utilisons à tous les endroits du framework PhalApi est en fait un objet, qui n'existe que dans la mémoire, pour une zone, le code est le suivant :
public static function one(){ if(self::$instance == NULL){ self::$instance = new PhalApi_DI(); self::$instance->onConstruct(); } return self::$instance; }<.>En fait, ce n'est pas difficile. Nous utilisons simplement new pour encapsuler le fonctionnement d'une classe dans la méthode statique de la classe dont nous avons besoin new. Ensuite, nous faisons le même jugement que ci-dessus, et c'est très simple d'implémenter le mode singleton. .
//配置 DI()->config = new PhalApi_Config_File(API_ROOT . '/Config');En fait, il existe un tableau en interne, qui utilise config comme clé et new PhalApi_Config_File(API_ROOT. '/Config') comme valeur. . Ensuite, il est enregistré. Lorsque nous utiliserons DI->config->get(); la prochaine fois, la nouvelle classe sera supprimée en fonction de la configuration de la valeur clé, on peut donc dire que l'opération de configuration dépend de DI. (). De plus, lors de l'utilisation de DI()->config, il y a toujours une instance en cours d'utilisation, ce qui peut également réduire la consommation de ressources Certains enfants se demandent pourquoi DI()->config est enregistré. Le tableau sera retiré en cas de besoin. Les enfants intéressés peuvent rechercher sur Baidu des méthodes magiques et obtenir
/**大家可以看到这是PhalApi_DI中的魔法方法__set * 也就是当使用DI()->config = new PhalApi_Config_File(API_ROOT . '/Config');的时候 * 获得的name值就是config,获得的value也就是new PhalApi_Config_File(API_ROOT . '/Config'); */get同理,在内部实现都是调用了内部get和set方法 public function __set($name, $value){ $this->set($name, $value); } public function __get($name){ return $this->get($name, NULL); }Après avoir lu ceci, pensez-vous que c'est très simple. propres classes à l'avenir. Cette méthode magique flexible est utilisée pour y parvenir.
//当我们执行以下语句的时候,在依赖注入的时候存的是value值是字符串的test DI()->test = 'test'; //使用DI()->test->test();的时候会使用到PhalApi中的get方法,在get方法中有一段代码 $this->data[$key] = $this->initService($this->data[$key]); //在initService方法内部验证了value是字符串就实例化了再返回 if($config instanceOf Closure){ $rs = $config(); }elseif(is_string($config) && class_exists($config)){ $rs = new $config(); if(is_callable(array($rs, 'onInitialize'))){ call_user_func(array($rs, 'onInitialize')); } }else{ $rs = $config; }
Recommandations associées :
. phalapi Comment réaliser la séparation en lecture et en écriture de la base de données
Utilisation du cache phalapi et de l'extension Redis
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!