2014-06-24 12 views
5

Attualmente ho una classe con dipendenze strettamente accoppiate e il costruttore della classe non ha attualmente alcun parametro. Sto cercando di essere in grado di passare facoltativamente in diverse dipendenze senza modificare la firma del costruttore e quindi di interrompere le applicazioni che attualmente usano la classe.Valori predefiniti per l'iniezione delle dipendenze

sono arrivato fino a questo modello:

class Car { 
    private $engine; 

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

questo modo auto potrebbe ancora essere creato (con un motore di default) con new car(), o passando in un motore personalizzato: new Car(array('engine' => new CustomEngine())).

È un modo corretto per farlo? Che problemi ha questo con la manutenibilità?

+1

Sei sulla strada giusta! L'iniezione di dipendenza è esattamente questa. – colburton

+1

Penso che questo si riferisca a http://stackoverflow.com/q/8295060/1767861, dovresti leggere le risposte date :) –

risposta

4

Questo è uno schema corretto secondo me, lo uso spesso.

Iniezione di dipendenza consente all'utente della classe di fornire le dipendenze. Con il tuo codice, è possibile, quindi non vedo alcun problema.

L'unica cosa che faccio in modo diverso è che utilizzo parametri espliciti, in modo da poter digitare -intensificare gli oggetti per assicurarmi che siano della classe corretta e per rendere più facile sapere quali parametri possono essere passati senza guardando il codice:

class Car { 
    private $engine; 

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

Oh, non mi è mai venuto in mente che posso impostare un parametro di tipo opzionale in questo modo. Ho provato '__construct (Engine $ engine = new Engine())', che ovviamente non ha funzionato. Grazie! – algoni

Problemi correlati