2014-06-24 18 views
5

Ich habe derzeit eine Klasse mit eng gekoppelten Abhängigkeiten, und der Klassenkonstruktor hat derzeit keine Parameter. Ich versuche in der Lage zu sein, optional verschiedene Abhängigkeiten zu übergeben, ohne die Konstruktorsignatur zu ändern und somit Anwendungen zu zerbrechen, die die Klasse derzeit verwenden.Standardwerte in Abhängigkeitsinjektion

kam ich mit diesem Muster auf:

class Car { 
    private $engine; 

    public function __construct($options = array()) { 
     if (isset($options['engine']) { 
      $this->engine = $options['engine']; 
     } else { 
      $this->engine = new Engine(); 
     } 
    } 
} 

Auf diese Weise Auto nach wie vor (mit einem Standard-Motor) mit new car() erstellt werden kann, oder von in einem benutzerdefinierten Motor vorbei: new Car(array('engine' => new CustomEngine())).

Ist dies ein korrekter Weg, dies zu tun? Welche Probleme hat dies mit Wartbarkeit?

+1

Sie sind auf dem richtigen Weg! Abhängigkeitsinjektion ist genau dies. – colburton

+1

Ich denke, das bezieht sich auf http://Stackoverflow.com/q/8295060/1767861, sollten Sie die gegebenen Antworten lesen :) –

Antwort

4

Dies ist ein korrektes Muster meiner Meinung nach, ich benutze es oft.

Abhängigkeitsinjektion ermöglicht dem Benutzer der Klasse, die Abhängigkeiten bereitzustellen. Mit deinem Code ist es möglich, also sehe ich kein Problem damit.

Die einzige Sache, die ich anders mache, ist, dass ich explizite Parameter verwende, so dass ich die Objekte eintippen kann, um sicherzustellen, dass sie von der richtigen Klasse sind und um zu wissen, welche Parameter ohne übergeben werden können Blick auf den Code:

class Car { 
    private $engine; 

    public function __construct(Engine $engine = null) { 
     $this->engine = $engine ?: new Engine(); 
    } 
} 
+1

Oh, es ist mir nie in den Sinn gekommen, dass ich einen typhinted Parameter optional so einstellen kann. Ich habe '__construct (Engine $ engine = new Engine())' versucht, was natürlich nicht funktioniert hat. Vielen Dank! – algoni