2016-04-18 17 views
0

Ich erstelle meinen eigenen Container, habe ich "bind" -Methode, die "String $ Alias" und "Closure $ Closure" bekommen. Das Verfahren bindet das Alias ​​für das Objekt auf dem $ Behälter Array, wie folgt aus:was zu meinem container ioc hinzufügen? php

public function bind(string $alias,$closure) 
{ 
    $this->container[$alias] = $closure(); 
} 

Die zweite Methode „Anruf“ ist, das bis zu einem gewissen weise aus dem Behälter einfach $ nennen. Natürlich überprüft zuerst die Methode, ob der gegebene Alias ​​existiert, und wenn keine Ausnahme ausgelöst wird.

ist das gut? Was muss ich noch hinzufügen? Weil ich zum Beispiel auf Laravel gesehen habe, dass der Container voller Methoden und Requisiten ist, und ich weiß nicht warum. es ist nur bind und rufen, nicht?

+0

Ich würde persönlich die Schließung speichern und es auf Nachfrage anstatt auf binden nennen. Auf der einen Seite benötigen Sie möglicherweise nicht alle gebundenen Objekte während eines einzelnen Aufrufs, so dass Sie bei der Ressourcenzuteilung sparen, auf der anderen Seite kann der Zustand des gebundenen Objekts davon abhängen, wann es aufgerufen wird und nicht, wann es gebunden ist. – apokryfos

+0

Warum muss ich den Verschluss speichern? was kann ich damit machen? – user412499

Antwort

0

Mein Vorschlag ist, folgendes zu tun:

Bind

public function bind(string $alias,$closure) 
{ 
    $this->container[$alias] = $closure; 
} 

Call (neue Instanz pro Anruf)

public function call(string $alias) 
{ 
    if(array_key_exists($alias,$this->container)) { 
     $closure = $this->container[$alias]; 
     return $closure(); 
    } 
    throw new \Exception(); 
} 

Call (Singleton-Verhalten)

public function call(string $alias) 
{ 
    if (array_key_exists($alias,$this->instanceContainer)) { 
     return $this->instanceContainer[$alias]; 
    }   
    if(array_key_exists($alias,$this->container)) { 
     $closure = $this->container[$alias]; 
     $this->instanceContainer[$alias] = $closure(); 
     return $this->instanceContainer[$alias]; 
    } 
    throw new \Exception(); 
} 

Welche der beiden Implementierungen Sie für den Anruf auswählen, hängt von Ihren Anforderungen ab. Wenn Sie die Funktion nur einmal pro Objekt aufrufen müssen, gehen Sie zum zweiten. Sie können auch zwei Methoden verwenden: bind und bindSingleton, um die zwei verschiedenen Bindungstypen zu unterscheiden.

Es gibt zwei Hauptgründe, warum ich dies empfehlen:

  1. Das Objekt auf Nachfrage erzeugt wird, was bedeutet, dass, wenn Sie 1000 Objekte binden, aber nur 10 verwenden Sie nur 10 Objekte erstellen werden.

  2. Das Ergebnis der $closure()-Methode kann je nach der Uhrzeit, zu der es aufgerufen wurde, abweichen. Wenn Sie beispielsweise ein Objekt instanziieren möchten, das einen Zeitstempel enthält, ist das Instanziieren beim Aufruf und nicht beim Binden sinnvoller.

+0

und $ instanceContainer für Singleton-Bindungen verwenden? – user412499

+0

und Sie können Beispiele für Dinge geben, die für Singleton und Dinge, die ich nicht brauche, brauchen? – user412499

+0

Wenn Sie eine Funktion haben, die die Datenbankverbindung erstellt, ist das normalerweise ein Singleton, da Sie es einmal erstellen und überall verwenden werden. Wenn Sie eine Funktion haben, die z. Generieren Sie eine Instanz eines Modells basierend auf einem Datenbankeintrag, dann müssen Sie jedes Mal eine neue Instanz erstellen, da möglicherweise ein anderer Datenbankeintrag initialisiert werden muss. – apokryfos

Verwandte Themen