Visualizzazione risultati 1 fino 22 di 22

Discussione: classe Database, classe madre?

  1. #1
    Guest

    Predefinito classe Database, classe madre?

    Ciao,
    ho una classe database, che appunto serve per operare sul database. poi ho altre due classi (User e Template) che necessitano di usare delle funzioni della classe database, dovrei fare che le classe User e template sono un estensione della classe Database? cosi che possa usare comodamente tutte le funzioni di Database nele altre classi? o mi consigliate di usare altri metodi? creare un nuovo oggetto per ogni funzione mi sembra un po' strano... spero che sappiate darmi delle risposte...ciao e grazie...

  2. #2
    Guest

    Predefinito

    no, direi di no. Detta come l'hai messa giù tu creeresti più istanze della classe db (una volta per la classe template ed una per la user) e non sarebbe corretto.
    Il metodo più semplice sarebbe di usare global, oppure potresti pasare alle classi che usano il db una reference.
    Volendo ci sono altri metodi, io ad esempio ne uso un'altro ancora :)
    Ultima modifica di Inverno : 03-06-2009 alle ore 08.43.48

  3. #3
    Guest

    Predefinito

    mi faresti un esempio per le due alterative che hai citato per favore? grazie..ciao!

  4. #4
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    Dipende.
    Puoi estendere le classi base con la classe DB o anche usare la classe db direttamente dalla classe base (scelta consigliata)

    L'estensione è per estendere un comportamento di una classe, nel tuo caso vuoi USARE la classe DB.
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  5. #5
    Guest

    Predefinito

    ma particamente se avessi delle funzioni in una "classe1" che voglio utilizzare nella "classe2" devo creare un nuovo oggetto della "classe1" in ogni funzione della "classe2" dove voglio utilizzare queste funzioni? come posso fare per creare un solo oggetto e utilizzarlo per tutta la "classe2"?

    Grazie delle risp..ciao!

  6. #6
    Guest

    Predefinito

    Puoi instanziare classe1 al di fuori delle classi, ad esempio nel file che include tali classi, poi dentro classe2 richiami quell'istanza con global $nomeIstanza per poterla usare all'interno della classe2


    Ciao!

  7. #7
    Guest

    Predefinito

    ok, capito, ma quindi la classe1 la devo richimare in ogni funzione con global $nomeistanza?

  8. #8
    Guest

    Predefinito

    No, solo all'interno della classe, non all'interno dei metodi:

    class classe2{
    global $nomeistanza;

    function mio_metodo(){
    echo $nomeistanza->variabile;
    }

    }


    Ciao!

  9. #9
    Guest

    Predefinito

    facendo in questo modo mi da questo errore:
    Parse error: syntax error, unexpected T_GLOBAL, expecting T_FUNCTION in ... on line
    faccio esattamente come mi hai detto..

  10. #10
    Guest

    Predefinito

    Eh, me so sbagliato!
    E' come ipotizzavi tu, per ogni metodo devi richiamare (global) l'istanza già creata.


    Ciao!

  11. #11
    Guest

    Predefinito

    ok, grazie mille dell'aiuto!!! se caso conoscete altri metodi fatemi sapere!! ciaociao...

  12. #12
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    Esistono le funzioni statiche che si chiamano senza creare l'oggetto, ma penso che tu stia facendo un pò di confusione nell'uso delle classi.
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  13. #13
    L'avatar di AlexKidd
    AlexKidd non è connesso Altervistiano Junior
    Data registrazione
    09-02-2007
    Messaggi
    516

    Predefinito

    è meglio istanziare ogni oggetto che deve utilizzare il database passandogli il riferimento all'oggetto, che colloquia direttamente con la base di dati, come argomento del costruttore

    in questo modo si inizializza la variabile di istanza e si evita l'uso di "global"

  14. #14
    Guest

    Predefinito

    avevo pensato che si potesse fare qualcosa nella funzione construct, ma nn sapevo cosa fare, AlexKidd mi puoi fare un esempioo perfavore? intendi creare l'oggetto all'interno del costruttore?

  15. #15
    Guest

    Predefinito

    Codice PHP:
    class foo{
    private
    $database;
    function
    __construct( &$ref ){
    $this->database =& $ref;
    }
    }
    quando instanzi "foo" gli passi anche il riferimento al db

    Codice PHP:
    $foo = new foo( &$istanza_database );

    p.s. prendilo con le pinze l'ho scritto al volo, comunque l'idea generale è questa
    Ultima modifica di Inverno : 04-06-2009 alle ore 09.30.51

  16. #16
    Guest

    Predefinito

    funziona!! grazie mille...ciaociao...

  17. #17
    L'avatar di AlexKidd
    AlexKidd non è connesso Altervistiano Junior
    Data registrazione
    09-02-2007
    Messaggi
    516

    Predefinito

    "&" non serve, la variabile contiene già un riferimento all'oggetto (in PHP5 ovviamente, nella precedente versione invece era necessario)

  18. #18
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    Io non faccio così
    Nel caso del DB è utile solo in alcuni casi la creazione di una sola istanza della classe DB
    Faccio così
    Codice PHP:
    Calsse Miaclasse
    {
    private
    $DB;

    __construct()
    {
    $this->DB = new ClasseDB();
    }

    public function
    Funzione()
    {
    $this->DB->Exec("SELECT blabla from bla");
    }
    }
    La classe la crei sempre nel costruttore.
    Questo facilita l'uso della classe, dato che ogni volta non devi passarci un istanza di una classe.
    La velocità è leggermente più lenta esegui molte query in molte classi differenti, ma in php è un caso raro.
    In più a meno di non specificarlo(pconnect) la connessione non è persistente e si disconnette dopo la prima query, quindi un unica istanza diventa inutile e scomodo.

    Se cmq vui continuare con la prima versione cerca pattern signleton per evitare di creare inavvertitamente più istanze della classe.
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  19. #19
    L'avatar di AlexKidd
    AlexKidd non è connesso Altervistiano Junior
    Data registrazione
    09-02-2007
    Messaggi
    516

    Predefinito

    se non ricordo male... "connessione persistente" permette di rimanere connessi non tra una query e l'altra (cosa che avviene sempre) ma tra l'esecuzione di più script (o tra più pagine)

  20. #20
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    Azz è vero!
    ... un buon motivo per non usare MAI pconnect
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  21. #21
    Guest

    Predefinito

    sconsiglio vivamente quanto proposto da Binarysun (almeno nelle applicazioni web)
    per 2 semplici motivi
    1) istanziare inutilmente è uno spreco di memoria (ricordo che abbiamo un limite di memoria per gli script)
    2) il numero massimo di connessioni al db è prestabilito (variabile max_connections di mysql) pertanto se per uno script utilizzo ipoteticamente 3 connessioni, riduco ad un 1/3 i possibili utenti connessi al db

  22. #22
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    Per il punto 1... Lo spreco di memoria è minimo, sono altri i punti critici della memoria.
    I problemi di memoria si hanno quando manegi grossi file.
    Per il punto 2... Il numero di connessioni sarebbe uguale al tuo esempio , quando fai connect se la connessione è già aperta non ne apre un altra.
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •