Injection de dépendances DI et implémentation singleton de phalapi

*文
Libérer: 2023-03-18 10:10:01
original
1788 Les gens l'ont consulté

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();
}
Copier après la connexion

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;
}
Copier après la connexion
<. 🎜>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. .


2. Injection de dépendances

L'injection de dépendances est également appelée "inversion de contrôle", si vous êtes familier avec Spring dans le développement Javaweb. compréhension plus approfondie du framework. Je n'entrerai pas dans les détails ici. J'expliquerai simplement l'implémentation de l'injection de dépendances DI dans PhalApi afin que tout le monde puisse comprendre comment ce modèle de conception est implémenté et le mécanisme de chargement paresseux implémenté sur cette base.


2.1 Implémentation de l'injection de dépendance DI

La méthode DI() couramment utilisée dans PhalApi consiste à utiliser le mode dit singleton ci-dessus. pour dire, chaque fois que nous utilisons DI(), nous utilisons en fait la classe PhalApi_DI, donc la clé de notre injection de dépendances est dans PhalApi_DI


Parlons de l'un des. sa méthode d'implémentation est spécifique. Voici un exemple :

//配置
DI()->config = new PhalApi_Config_File(API_ROOT . &#39;/Config&#39;);
Copier après la connexion
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 . &#39;/Config&#39;);的时候
 * 获得的name值就是config,获得的value也就是new PhalApi_Config_File(API_ROOT . &#39;/Config&#39;);
 */get同理,在内部实现都是调用了内部get和set方法
public function __set($name, $value){
    $this->set($name, $value);
}
public function __get($name){
    return $this->get($name, NULL);
}
Copier après la connexion
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.


2.2 Chargement paresseux

La méthode DI() dans PhalApi fournit également des classes paresseuses. chargement. Comme le mot l'indique, la classe ne sera pas chargée lorsqu'elle n'est pas utilisée. Cette opération vise également à éviter de gaspiller des ressources inutiles. Elle ne sera jamais instanciée lorsque nous ne l'utilisons pas. . Accédez à la nouvelle classe et instanciez-la avant de l'utiliser. Voyons comment elle est implémentée

//当我们执行以下语句的时候,在依赖注入的时候存的是value值是字符串的test
DI()->test = &#39;test&#39;;
//使用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, &#39;onInitialize&#39;))){
        call_user_func(array($rs, &#39;onInitialize&#39;));
    }
}else{
    $rs = $config;
}
Copier après la connexion

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

PhalApi (framework π)

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!