Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    usare un include in una classe, pessima soluzione, come fare?

    Salve, ho appena iniziato a programmare a oggetti e già ho bisogno di aiuto :-)

    comunque, vi descrivo la situazione

    io ho un file con i dati di connessione al db, chiamiamolo conf.php
    <?
    $host='localhost';
    $dbname='salvatore';
    $dbuser='root';
    $dblogin='';
    ?>
    e un file chiamato connettidb.php, dove istanzio la pdo,
    <?
    $col = 'mysql:host='.$host.';dbname='.$dbname;
    try {
    //connessione tramite creazione di un oggetto PDO
    $db = new PDO($col , $dbuser, $dblogin);
    }
    // blocco catch per la gestione delle eccezioni
    catch(PDOException $e) {
    // notifica in caso di errorre
    echo 'Attenzione: '.$e->getMessage();
    }
    ?>

    quindi sto scrivendo una classe: elenco, che data una tabella sul mio database,passandogli il nome della tabella, l'elenco dei campi da stampare, e il titolo dei campi da stampare mi stampa la tabella corrispondente già formattata

    include 'conf.php';
    class ELENCO
    {
    public $nometabella;
    ....
    function __construct ($nometab,$nomicamp,$campitab)
    {
    $this->nometabella = $value;
    ....
    }
    public function getelenco()
    {
    include 'conf.php';
    include 'connettidb.php';
    //faccio la query sulla tabella e va tutto ok
    ...
    }
    }

    e così funziona e va tutto bene. ora, il mio problema è che vorrei creare una ulteriore funzione, getcategoria, che prende la categoria del record (per esempio la categoria dell'articolo) re me li inserisce fra gli altri dati. Voglio separarla per potere, nel caso, estendere questa classe e riscrivere appunto questa funzione getcategoria, che in certi casi mi serve prenda dati da un'altra sorgente.

    potrei ovviamente fare così:

    include 'conf.php';
    class ELENCO
    {
    public $nometabella;
    ....
    function __construct ($nometab,$nomicamp,$campitab)
    {
    $this->nometabella = $value;
    ....
    }
    public function getcategoria()
    {
    include 'conf.php';
    include 'connettidb.php';
    //faccio la query sulla tabella e va tutto ok
    ...
    }
    public function getelenco()
    {
    include 'conf.php';
    include 'connettidb.php';
    $this->getcategoria();
    //faccio la query sulla tabella e va tutto ok
    ...
    }
    }

    ma è una soluzione che pur funzionando è quanto di più lontano da un sistema performante, anche perché già la prima soluzione per 7 campi da recuperare, mi da un tempo di 1,02382 secondi, ma la seconda mi da circa il doppio 2,04007 secondi. Tutto tempo preso appunto da istanziare due volte la stessa classe.


    c'è sicuramente una soluzione migliore, sapreste indicarmela, anche a grandi linee?

  2. #2
    Mai sentito parlare di Singleton pattern?
    http://www.devme.it/magico-mondo-de-...e-come-usarlo/

    Se il tuo file connettidb.php lo trasformi in una classe seguendo questo pattern, non avrai più il problema di istanziare la stessa classe più volte.
    CODENCODE \ Branding \ Design \ Marketing
    www.codencode.it

  3. #3
    Ok, grazie, guardo subito, anche perché in effetti sembra un' ottima soluzione
    Di mio, ero riuscito a risolvere, in maniera però meno riutilizzabile, così:
    class ELENCO
    {
    ...
    public $host='localhost';
    public $dbname='nomedb';
    public $dbuser='root';
    public $dblogin='';
    public $prefix='sal_'

    function __construct ($value,$value2,$value3) {
    ....
    $this->col = 'mysql:host='.$this->host.';dbname='.$this->dbname;
    $this->db = new PDO($this->col , $this->dbuser, $this->dblogin);
    ...
    }
    }

    ora provo subito la soluzione suggerita, gracie :-)

  4. #4
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Per la connessione al db, potresti anche evitare di usare una classe singleton.
    Un altra soluzione è quella di far estendere la tua classe ELENCO una classe generica per il db.
    Es:
    Codice PHP:
    class myDb{
     private 
    $host='localhost';
     private 
    $dbname='nomedb';
     private 
    $dbuser='root';
     private 
    $dblogin='';
     private 
    $prefix='sal_';
     private 
    $db;

     private function 
    connect(){
         
    $this->col 'mysql:host='.$this->host.';dbname='.$this->dbname;
         
    $this->db = new PDO($this->col $this->dbuser$this->dblogin); 
     }

     
    // Altre funzioni comuni

    }

    class 
    Elenco extends myDb{
       public 
    $nometabella;
       function 
    __construct ($nometab,$nomicamp,$campitab
       {
         
    $this->nometabella $value;
         
    $this->connect();  
       }
       public function 
    getCategoria{
          
    // fai la query con $this->db
       


      ...

    Poi ci sono altri modi più o meno efficaci. Ad esempio, in questo caso tutte le tue classi derivate da myDb sarebbero legate a PDO. Se un giorno vorresti cambiare driver oltre alla classe myDb dovresti modificare tutte le altre classi

  5. #5
    Grazie anche a te, questa soluzione, che sto provando a realizzare, per ora mi sembra più adatta alla mia scarna conoscenza, Comunque ho già ordinato un libro sui pattern e ne ho scaricato un altro da internet, e spero al più presto di farmi almeno una infarinatura.

    Effettivamente se cambiassi la pdo, dovrei riscrivere un po' di codice,da quello che mi sembra di capire, ma neanche tanto immagino, no? alla fin fine, se cambiassi, potrei provare a riscrivere la classe my db, con il suo nuovo driver, e quindi rifare il metodo query, etc..., etc..., oltre a ciò la pdo è già "fatta a oggetti" e quindi dovrei salvarmi abbastanza, sotto questo aspetto, no?

    Lo chiedo sul serio, devo ancora sgranchirmi sulla programmazione ad oggetti, da quando la studiavo alle superiori, comunque nessun paragone con altri approcci.

  6. #6
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Con PDO dovresti stare tranquillo...ma potrebbe capitarti che su un host non sia abilitato e quindi dover riscrivere tutto utilizzando mysql(i).

    La cosa migliore sarebbe quella di lavorare, nella tua classe elenco, con un oggetto che non dipende dal driver che usi. Al volo mi verrebbe da fare qualcosa del tipo

    Codice PHP:
    class myPDODb{
        public function 
    connect();
        
        public function 
    insert($table$fields$values);
        public function 
    delete($table$id);
        public function 
    find($table$conditions$limit$order$etc);
        public function 
    query($sql);
    }

    class 
    myMysqliDb(){
        public function 
    connect();
        
        public function 
    insert($table$fields$values);
        public function 
    delete($table$id);
        public function 
    find($table$conditions$limit$order$etc);
        public function 
    query($sql);
    }

    class 
    model{
       private 
    $db;
       public 
    $table;
      
       public function 
    valiates();
       public function 
    beforeSave();
       public function 
    afterSave();

       public 
    getDb(){
            
    // In base a come è configurato l'host, carico la classe giusta
            // es: $this->db = new myPDODb(); 
       
    }

       public function 
    insert($fields$values){
             
    // posso validare i dati prima di salvarli nel db
             
    $this->validates();
             
    // posso eseguire un azione prima di salvare. es hash di una password
             
    $this->beforeSave();
             
    // inserisco nel db, senza preoccuparmi di quale driver uso
             
    $this->db->insert($this->table$fields$values);
             
    // posso fare un'azione dopo il salvataggio
             
    $this->afterSave();
       }
       public function 
    delete($id){
           ...
       }
    }

    class 
    Elenco extends Model{
       public 
    $table 'elenco';
       public 
    __construct(){
           
    $this->getDb();
       }

       public function 
    getCategoria(){
            return 
    $this->find(...);
       }


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.