Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481

    [PDO] quanti oggetti istanziare?

    Mi chiedevo quale tra le due strade sia la migliore in termini di prestazioni e pulizia del codice:
    [list=1][*]istanziare un solo oggetto PDO all'inizio e richiamare l'unico oggetto da funzioni e classi con global[*]istanziare nuovi oggetti PDO all'occorrenza, quindi ogni metodo di classe che ne ha bisogno ne istanzierà uno, e lo stesso accadrà nelle funzioni[/list=1]

    da una parte, istanziare un solo oggetto mi viene da pensare che sia meglio dal punto di vista delle performance, però per contro obbliga a richiamare come global l'oggetto creato, voi che fate di solito?

  2. #2
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    Se necessiti di una sola istanza, è ovvio che quello che ti basta è una istanza.

    e richiamare l'unico oggetto da funzioni e classi con global
    Non è l'unica strada che puoi percorrere. Puoi richiamare l'istanza accedendovi da una classe che implementa il singleton. Puoi passare l'istanza come parametro; Vedi dependency injection. Etc. Etc.

    Volendo essere più costruttivo, ti potrà tornare molto utile: http://pimple.sensiolabs.org/

  3. #3
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da .Kurt
    Se necessiti di una sola istanza, è ovvio che quello che ti basta è una istanza.


    Non è l'unica strada che puoi percorrere. Puoi passare l'istanza come parametro, vedi dependency injection. Puoi richiamare l'istanza accedendovi da una classe che implementa il singleton. Etc. Etc.
    purtroppo la mia base di programmazione, anche se sono arrivato agli oggetti, non ha ancora toccato i singleton. Nella mia domanda, alla fine se si lavora con un solo DB chiaramente basterebbe una sola istanza, ma magari classi e metodi diversi fanno operazioni completamente diverse, anche se alla fine operano tutti su tabelle appartenenti allo stesso DB, per cui passare l'oggetto pod risulterebbe scomodo, sarebbe più pratico usare il global, però ripeto, non mi riferisco a metodi che andrebbero a lavorare su statement specifici, altrimenti è ovvio che li si passa come parametro, altrimenti va a pu__ane il paradigma della OOP, mi riferisco a classi assolutamente non correlate l'una con l'altra che fanno cose completamente diverse.

  4. #4
    Utente di HTML.it L'avatar di garakkio
    Registrato dal
    Dec 2011
    residenza
    Roma
    Messaggi
    480
    +1 per dependency injection.
    Singleton come seconda scelta

  5. #5
    Originariamente inviato da garakkio
    +1 per dependency injection.
    Singleton come seconda scelta
    +1 anche per me ma ci vuoe una struttura globale ben pensata
    Questa volta, più che un voto.. è favoreggiamento.

  6. #6
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Molto rapidamente ho dato una scorsa per capire di cosa parlate per dependency injection, esempio, oggetto macchina e oggetto motore, l'oggetto macchina contiene una proprietà (dipendenza) che fa riferimento all'oggetto motore, macchina dipende da motore, ed invece che istanziare motore da dentro macchina decido (attraverso le 3 strade possibili) di fare l'injection del motore quando definisco la classe macchina (o tramite set ecc) ma...chiaro che c'è una dipendenza tra classi del genere, la macchina dipende per forza dal motore, altrimenti non cammina. Ma nel mio esempio, sto parlando di classi completamente scollegate, oggetti che nulla hanno a che vedere l'uno con l'altro! Il fatto che una classe debba fare eseguire una query non ha nulla a che vedere, in senso logico, con una sorta di unico oggetto PDO da iniettare, fare questo mi costringerebbe a dover passare l'oggetto pdo istanziato ogni volta che istanzio un oggetto di una classe che deve fare una query...mi sembra scomodo e non coerente con il senso di, appunto, dependency, dico male?!

  7. #7
    Utente di HTML.it L'avatar di garakkio
    Registrato dal
    Dec 2011
    residenza
    Roma
    Messaggi
    480
    Dici male sì: se in un oggetto devi fare una query e se per fare la query hai scelto di usare PDO, hai una dipendenza da PDO.
    Se escludiamo il terribile espediente della global (siamo mica più negli anni '90), l'injection nel costruttore resta la soluzione migliore (seguita, IMHO, dal singleton)

  8. #8
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da garakkio
    Dici male sì: se in un oggetto devi fare una query e se per fare la query hai scelto di usare PDO, hai una dipendenza da PDO.
    Se escludiamo il terribile espediente della global (siamo mica più negli anni '90), l'injection nel costruttore resta la soluzione migliore (seguita, IMHO, dal singleton)
    Ok grazie, ho capito cosa intendi, mi sembra un po' oneroso ma seguo la strada dell'injection, passerò ai costruttori delle classi che devono fare interrogazioni al db l'unica istanza dell'oggetto pdo (pre)creata in modo che la referenzino ad una proprietà apposita. Un singleton...per quello che ho letto mi sembrerebbe più calzante, o forse di applicazione più rapida...ma visto che siete tutti concordi all'unanimità per dependency injection...

  9. #9
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    ma visto che siete tutti concordi all'unanimità per dependency injection.
    nessuno di noi ti può dire quale pattern sia più adatto per le tue esigenze.
    singleton, ad esempio, viene sconsigliato per una serie di motivi, ma rimane comunque una opzione da considerare, come tutte le altre.

    dato che mi sembri interessato a "qual'è la pratica migliore per quel problema", io ti indirizzerei verso questo sito. Non ti devi inventare niente di nuovo.

  10. #10
    Mah qui il discorso è semplicemente per specificare la scelta del driver e parametri di connessione per la classe PDO, non tanto l'uso della classe in se. La differenza sostanziale tra singleton e DI è se scegliere una struttura del tipo:

    Codice PHP:

    class MyModel{

    private 
    $pdo null;
    public function 
    __construct(){
    $this->pdo MyFactory::getPDO(); //ritorna singleton pdo
    }

    }


    //nella pratica
    $model = new MyModel();
    print_r($model->findAll()); 
    mentre in DI

    Codice PHP:

    class MyModel{

    private 
    $pdo;
    public function 
    __construct($myPdoClass){
    $this->pdo $myPdoClass;
    }

    }


    $model MyContainer::getModel('MyModel'); //MyContainer::getModel istanzia
    //un oggetto MyModel e nel costruttore gli passa una reference al pdo di turno 
    dove, come vedi, nel primo caso MyModel dipende fortemente da MyFactory, nel secondo caso invece MyModel è libero da dipendenze esterne e ci pensa MyContainer ad istanziare MyModel e a passargli la referenza al pdo di turno
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.