Ho risposto a una domanda (link) che ho usato una creazione del nuovo oggetto in un'altra classe costruttore, qui l'esempio:Perché non "creare un'istanza di un nuovo oggetto all'interno del costruttore di oggetti"?
class Person {
public $mother_language;
function __construct(){ // just to initialize $mother_language
$this->mother_language = new Language('English');
}
E ho avuto il commento da utente 'Matija' (his profile) e lui ha scritto: Non dovresti mai istanziare un nuovo oggetto all'interno del consturctor dell'oggetto, le dipendenze dovrebbero essere spinte dall'esterno, quindi chiunque usi questa classe sa da cosa dipende questa classe!
In generale, sono d'accordo con questo, e comprendo il suo punto di vista.
Tuttavia, ho usato per fare questo in questo modo molto spesso, ad esempio:
- come le proprietà private altre classi mi danno la funzionalità che posso risolvere non duplicare il codice, ad esempio, posso creare una lista (classe che implementa
ArrayAccess
interfaccia) di oggetti), e questa classe verrebbe utilizzato in un'altra classe, che ha una tale elenco di oggetti, - alcune classi usare per esempio
DateTime
oggetti, - se
include
(o autocaricamento) dipendente classe, non si dovrebbe avere problemi con err ors, perché gli oggetti dipendenti possono essere molto numerose, passando tutti al costruttore della classe può essere molto lungo e non è chiaro, ad esempio
$color = new TColor('red'); // do we really need these lines? $vin_number = new TVinNumber('xxx'); $production_date = new TDate(...); ... $my_car = new TCar($color, $vin_number, $production_date, ...............);
come mi è stato "nato" in Pascal, poi a Delphi, ho alcune abitudini da lì. E in Delphi (e FreePascal come suo concorrente) questa pratica è molto spesso. Ad esempio, esiste una classe
TStrings
che gestisce l'array di stringhe e per archiviarle non utilizzaarray
s ma un'altra classe,TList
, che fornisce alcuni metodi utili, mentreTStrings
è solo una sorta di interfaccia. L'oggettoTList
è dichiarato privato e non ha accesso dall'esterno, ma i getter e setter delloTStrings
.- (non importante, ma qualche ragione) di solito sono quello che usa le mie lezioni.
Per favore spiegami, è davvero importante evitare di creare oggetti nei costruttori?
Ho letto this discussion ma ho ancora una mente poco chiara.
@ Matia Leggo, grazie. Volevo dire che capisco cosa intendi ma non posso essere d'accordo nel permettere l'accesso alle proprietà della classe dall'esterno a chiunque altro. Se fornisco un corso a qualcuno, penso che dovrebbe ottenere un dispositivo funzionante, che possa costruire e ottenere tutto ciò di cui ha bisogno. Non voglio fargli creare molti oggetti aggiuntivi che il suo scopo potrebbe non essere chiaro o voglio mantenerlo segreto, ecco perché. E non voglio che lui gestisca questo oggetto di proprietà fuori dalla mia classe, questo è il mio oggetto e stare lontano da esso. – Voitcus
@Voitcus Ecco perché abbiamo contenitori di iniezione delle dipendenze, che possono costruire oggetti per noi, con tutte le loro dipendenze. Quindi l'utente del tuo sistema non costruirà tutti gli oggetti, dirà semplicemente: $ container-> getService ("Person"); E il contenitore utilizzerà Dependency Injection per costruire oggetti Person con tutte le dipendenze. Ho scritto un bel piccolo contenitore per l'iniezione di dipendenze per il mio MVC, puoi verificarlo qui: https://github.com/matijabozic/php_services – Matija
@Matija Si prega di postarlo come risposta e quindi potrei accettarlo – Voitcus