Devo istanziare altre classi in un constructor?

Recentemente, ho visto un mio collega istanziare le sue classi in un constructor, quindi ho iniziato a fare lo stesso, in questo modo:

class FooBar{ private $model1; private $model2; public function __construct() { $this->model1=new Model1(); $this->model2=new Model2(); } } 

E ora sto iniziando a chiedermi, se forse l'istanziazione dei templates dovunque siano necessari potrebbe essere migliore?

Ad esempio, function foo() richiede model1 e function bar() richiede model2, ma ora vengono caricati entrambi i templates.

Quindi, la domanda: è questo il modo giusto per istanziare altre classi? O dovrei semplicemente istanziarli quando ne ho bisogno in una function?

Bene, come sempre non esiste una taglia adatta a tutte le risposte.

La maggior parte delle volte , la class FooBar aggrega $model1 e $model2 perché ha bisogno di loro per adempiere alla sua function. In questo scenario non c'è molto che FooBar possa fare a less che non abbia oggetti in queste variables, quindi è la cosa giusta da fare per crearli nel constructor.

A volte un object aggregato non è necessario per eseguire gran parte della function della class FooBar e la costruzione di tale object è un'operazione costosa. In questo caso, ha senso solo costruirlo su richiesta con codice come il seguente:

 class FooBar { private $model1; private $model2; public function Frob() { $model = $this->getModel1(); $model->frob(); } private function getModel1() { if ($this->model1 === null) { $this->model1 = new Model1; } return $this->model1; } } 

Tuttavia, questo è solo a volte . Se la class FooBar bisogno di $model1 per metà delle sue operazioni e $model2 per l'altra metà, ciò potrebbe indicare che FooBar soffre di un caso di "gettiamo tutto all'interno di una class" e dovremmo invece dividerlo in due classi.

Mi piacerebbe vedere queste dependencies iniettate nel constructor come parametri.

In realtà dovresti caricarli quando ne hai bisogno, altrimenti un sacco di templates che non sono richiesti (che potrebbero avere i loro costruttori con più templates di caricamento!) Si apriranno in memory each volta che avrai bisogno di un'operazione banale.

Non creare un nuovo model se non sei sicuro che lo userai (ad es. Modelli necessari per localizzare e simili)

Non è una scienza esatta, e dovresti seguire il tuo istinto su come organizzare il codice.

Se questo approccio diventa non mantenibile, o se vuoi testarlo unitamente, l'iniezione di dipendenza potrebbe venire in soccorso.

Ma se stai facendo script semplici e il tempo di sviluppo è un fattore importnte, il modo in cui lo stai facendo ora è sufficiente.