Visualizzazione dei risultati da 1 a 7 su 7

Discussione: problema classi

  1. #1

    problema classi

    Ciao a tutti.

    Utilizzo una classe "database" che gestisce connessione, esecuzione query, disconnessione ecc.

    Siccome per il mio sito utilizzo un'unica pagina index.php, in cui vado di volta in volta ad includere file diversi a seconda delle scelte dell'utente, ho istanziato, all'inizio di tale pagina, l'oggetto database e richiamato il suo metodo "connetti".

    In questo modo in ogni blocco che vado ad includere nel corpo della pagina non devo più preoccuparmi della connessione al database, fatta in testa alla pagina, ma eseguo semplicemente le query tramite il metodo "esegui".

    e fin qua tutto ok.

    Ora ho la necessità di scrivere una classe "news" che estende la classe "database", attraverso la quale gestisco l'immissione nel database di news.

    Ho pensato ad un metdo che vada a ricercare i dati di una specifica news:


    Codice PHP:
    # Recupera i valori dal database di una determinata notizia per usarli
        
    function recuperaValori($id_notizia) {
            
    $this->connetti();
            
    $query="SELECT * FROM notizie WHERE id=$id_notizia";
            
    $result$this->esegui($query);
            
            
    $letturamysql_fetch_array($result,MYSQL_ASSOC);
            
            
    $this->id $lettura[id];
            
    $this->titolo $lettura[titolo];
            
    $this->testo $lettura[testo];
            
    $this->immagine $lettura[immagine];
            
    $this->fonte $lettura[fonte];
                
        } 
    //fine metodo recuperaValori 
    Il mio problema è che sono costretto ad utilizzare il metodo "connetti" della classe "database", perchè se no non funziona. Ma quando vado ad istanziare l'oggetto news la connessione al database è già stata fatta in cima alla pagina, come dicevo prima.

    In questo modo mi connetto due volte e, si sa, le connessioni al database sono molto onerose in termini di prestazioni...

    soluzioni?

    grazie
    fox

  2. #2
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    non temere se fai n connessioni via PHP: MySQL e in generale i DBMS sono sufficientemente intelligenti da capire che l'interlocutore è sempre lo stesso e ti rendono immediatamente la stessa connessione e non una nuova.

    Creare una sottoclasse news da una superclasse database è sbagliato perchè le news non sono una "specializzazione" di DB. Piuttosto all'interno della classe news potresti avere un attributo privato che altro non se non un oggetto database cui deleghi le interrogazioni sul DB

    Se vuoi che la classe database non crei più di una istanza di se stessa e venga inizializzata una sola volta rendila singleton. In questo modo non hai neanche motivo di inizializzarla appositamente ma quando ti occorre il DB ne chiedi l'istanza alla classe stessa.

    Codice PHP:
    class database{
        static private 
    $database=null;
        ....    

        protected function  
    __construct(...) {
            
    //Inizializzo la connessione
            
    ....
        }
        
        static public function 
    GetDBIstance(...){
            if(
    is_null(self::$database))
                
    self::$database=new database(...);
            return 
    self::$database;
        }

        ...
    }

    //esempio di uso
    $db=database::GetDBIstance(...); 
    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

  3. #3
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,514
    invece di usare il singleton può definirla nalla index del sito e passarla come oggetto alla nuova classe
    nella index
    Codice PHP:
    $db = new tuaClasseDb(); 
    in tutti gli altri file inclusi
    Codice PHP:
    $classeNews = new classNews($db); 
    poi nel costruttore della classe news metti l'oggetto database in una variabile privata

    in questo modo risolvi aggiungendo una sola riga di codice in più. il singleton richiede un casino
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


  4. #4
    mah...non ho cpaito bene... forse ho ancora bisogno di qualche delucidazione.

    vi spiego meglio.

    pagina index.php , dove a seconda dei casi includo i miei blocchi
    Codice PHP:
    <?php 

          
    include("funzioni/class.database.php");
        include(
    "funzioni/class.news.php");

        
    $base_dati = new database;
        
    $base_dati->connetti(); 
        
    ?>
    <html>
    <head>

    <title>TITOLO</title>

    </head>

    <body>

     qua il corpo della pagina

    </body>
    </html>

    la classe notizia che richiamo è piu o meno così (ometto i metodi che non ci servono)
    Codice PHP:
    class notizia extends database {
        
            var 
    $id;
            var 
    $titolo;
            var 
    $testo;
            var 
    $immagine;
            var 
    $fonte;
            
            var 
    $new_titolo;
            var 
    $new_testo;
            var 
    $new_immagine;
            var 
    $new_fonte;
        
        
    ###############################

        
    function recuperaValoriForm() {
            
    $this->new_titolo $_POST[titolo];
            
    $this->new_testo $_POST[testo];
            
    $this->new_immagine $_POST[immagine];
            
    $this->new_fonte $_POST[fonte];
        }
        
    ##########################
        # Recupera i valori dal database di una determinata notizia per usarli
        
    function recuperaValori($id_notizia) {
            
                    
    $this->connetti();
            
                    
    $query="SELECT * FROM notizie WHERE id=$id_notizia";
            
    $result$this->esegui($query);
            
            
    $letturamysql_fetch_array($result,MYSQL_ASSOC);
            
            
    $this->id $lettura[id];
            
    $this->titolo $lettura[titolo];
            
    $this->testo $lettura[testo];
            
    $this->immagine $lettura[immagine];
            
    $this->fonte $lettura[fonte];
            
            
        } 
    //fine metodo recuperaValori

    #####################
              //altri metodi vari
    }// fine classe 
    la classe estende la classe database perchè ho bisogno dei suoi metodi per interrogare il database.

    prendiamo in esame il metodo recuperaValori():
    cosa posso mettere al posto di $this->connetti() per usare invece la variabile $base_dati che è il riferimento alla connessione già effettuata all'inizio della pagina?

    ho provato ad utilizzare direttamente nella classe la variabile $base_dati ma non funziona.
    fox

  5. #5
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,514
    basta che tu faccia così

    file index.php
    Codice PHP:
        $base_dati = new database

    Codice PHP:
    class news
    {
    private 
    $db
    function __construct($db)
    {
    $this->db $db;
    }

    file che includi quando istanzi la classe
    Codice PHP:

    $new 
    = new news$base_dati ); 
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


  6. #6
    ahhh perfetto!! grazie! ora credo proprio di aver capito!

    non è più necessario, che la classe "notizia" estenda la classe "database", in quanto l'argomento del costruttore è l'oggetto $base_dati! tutto chiaro.

    quindi ora per richiamare un metodo della classe "database" all'interno della classe "notizia" utilizzo questa sintassi

    Codice PHP:
    $this->db->esegui($query
    è giusto così? funzionare funziona!
    fox

  7. #7
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,514
    it's ok
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


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.