Heim  >  Artikel  >  Backend-Entwicklung  >  DI-Abhängigkeitsinjektion und Singleton-Implementierung von Phalapi

DI-Abhängigkeitsinjektion und Singleton-Implementierung von Phalapi

*文
*文Original
2017-12-23 16:48:331863Durchsuche

Ich glaube, dass viele Menschen mit dem einfachen Zinsmodell und der Abhängigkeitsinjektion vertraut sind. In diesem Artikel werden hauptsächlich die DI-Abhängigkeitsinjektion und der Singleton-Modus von Phalapi erläutert. Studierende, die sich für die Abhängigkeitsinjektion und den Singleton-Modus interessieren, können einen Blick darauf werfen.

1. Singleton-Modus

Der Singleton-Modus sollte Kindern, die schon lange objektorientierte Programmierung betreiben, auch schon davon gehört haben. Hier ist ein kurzer Chat. Lassen Sie uns darüber sprechen, was das Singleton-Muster ist, welche Probleme es löst und wie es in PhalApi implementiert wird.

Singleton Singleton bedeutet, dass es nur eine Existenz gibt , das ist der Singleton Zum Beispiel ist es nicht schwer, seine Vorteile zu erkennen, da er weniger Ressourcen verbraucht, weil es nur eine gibt. Jeder weiß, dass man eine Instanz haben muss, die jedes Mal neu ist new wird im Speicher ein Bereich zum Speichern der Instanz generiert. Wenn in einem Programmlauf viele neue Objekte verwendet werden, werden mehr Ressourcen verbraucht Globale Variablen, es wird unelegant und chaotisch sein. Der Singleton-Modus ist eine Methode, die das Beste aus beiden Welten bietet Es kann global verwendet werden, zweitens besteht kein Grund zur Sorge, zu viele Ressourcen zu belegen, und drittens ist es sehr elegant. Schauen wir uns an, wie das Singleton-Muster in PhalApi implementiert wird:


Dann Wir schauen in die eine Methode

//大家看到我们常用的DI方法内部实现的是PhalApi_DI中的静态方法one方法
function DI() {
    return PhalApi_DI::one();
}

Jedes Mal, wenn wir eine Anfrage erhalten, überprüfen Sie zunächst, ob die statische Variableninstanz nicht initialisiert wurde. Wenn es sich um den ersten Aufruf handelt, wird dies der Fall sein Instanziieren Sie die PhalApi_DI-Klasse intern, geben Sie dann einen negativen Wert an $instance und geben Sie dann die statische Variable der Instanz zurück. Wenn wir sie das nächste Mal aufrufen, wurde diese statische Variable instanziiert und überspringt den Instanzprozess direkt und geben Sie das Objekt direkt zurück. Das heißt, die DI-Methode, die wir an allen Stellen des PhalApi-Frameworks verwenden, ist tatsächlich ein Objekt, das nur im Speicher vorhanden ist. Für einen Bereich lautet der Code wie folgt:


Tatsächlich ist es nicht schwierig, die Operation einer Klasse in die statische Methode der Klasse zu kapseln, die wir benötigen. Dann fällen wir das gleiche Urteil wie oben, und es ist sehr einfach .

public static function one(){
    if(self::$instance == NULL){
        self::$instance = new PhalApi_DI();
        self::$instance->onConstruct();
    }
    return self::$instance;
}

2. Abhängigkeitsinjektion

Abhängigkeitsinjektion wird auch als „Umkehrung der Kontrolle“ bezeichnet. Wenn Sie mit Spring in der Javaweb-Entwicklung vertraut sind, sollten Sie eine haben Ich werde hier nicht näher auf die Implementierung der DI-Abhängigkeitsinjektion in PhalApi eingehen, damit jeder verstehen kann, wie dieses Entwurfsmuster und der darauf basierende Lazy-Loading-Mechanismus implementiert werden.

2.1 Implementierung der DI-Abhängigkeitsinjektion

Die in PhalApi häufig verwendete DI()-Methode verwendet natürlich den oben genannten sogenannten Singleton-Modus Das heißt, jedes Mal, wenn wir DI() verwenden, verwenden wir tatsächlich die Klasse PhalApi_DI, sodass der Schlüssel zu unserer Abhängigkeitsinjektion in PhalApi_DI liegt.

Lassen Sie uns über eine seiner Klassen sprechen Die Implementierungsmethode ist spezifisch. Hier ist ein Beispiel:


Tatsächlich gibt es intern ein Array, das config als Schlüssel und new PhalApi_Config_File(API_ROOT. '/Config') als Wert verwendet. Dann wird es gespeichert. Wenn wir das nächste Mal DI->config->get(); verwenden, wird die neue Klasse basierend auf der Schlüsselwertkonfiguration herausgenommen, sodass man sagen kann, dass die Konfigurationsoperation von DI( ). Darüber hinaus ist bei der Verwendung von DI()->config immer eine Instanz im Einsatz, was auch den Ressourcenverbrauch reduzieren kann.

Einige Kinder sind neugierig, warum DI()->config gespeichert wird Das Array wird bei Bedarf herausgenommen. Interessierte können auf Baidu nach magischen Methoden suchen.

//配置
DI()->config = new PhalApi_Config_File(API_ROOT . '/Config');

Denken Sie, dass es sehr einfach ist, es zu entwerfen? Klassen in der Zukunft. Diese flexible magische Methode wird verwendet, um dies zu erreichen.

/**大家可以看到这是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);
}

2.2 Lazy Loading

Die DI()-Methode in PhalApi bietet auch Lazy Loading Wie das Wort schon sagt, wird die Klasse nicht geladen, wenn sie nicht verwendet wird. Sie wird niemals instanziiert, wenn Sie sie verwenden. Gehen Sie zur neuen Klasse und instanziieren Sie sie, bevor Sie sie verwenden.

Verwandte Empfehlungen:

//当我们执行以下语句的时候,在依赖注入的时候存的是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;
}

phalapi So realisieren Sie die Lese- und Schreibtrennung der Datenbank

Verwendung von Phalapi-Cache und Redis-Erweiterung

PhalApi (π-Framework)

Das obige ist der detaillierte Inhalt vonDI-Abhängigkeitsinjektion und Singleton-Implementierung von Phalapi. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn