Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    Programmazione ad oggetti avanzata con php5

    Ciao, ho delle perplessità sull'esecuzione della struttura delle classi che sto facendo. Premetto che programmo con le classi fin da php4, ora ho tempo di rifare il mio cms in php5, quindi sto studiando diverse soluzioni. Cerco di utilizzare tutta la potenza degli oggetti di php5, ma alcune cose che sto facendo credo che concettualmente sono sbagliate (non ho letto molto sul php5, quindi non conosco tutto).

    In pratica ho una classe che gestisce la connessione al db, esecuzione query, risultati ecc. una classe che gestisce le sessioni di login che estende quella al db, quindi inserimento sessione su db, scrittura di cookie e metodi per il controllo se loggato ecc. ed infine una classe che gestisce i permessi utenti nelle varie sezioni del cms, con controlli se la pagina visualizzata e l'operazione eseguita fa parte dei privilegi dell'utente loggato.

    fin quì non ci sono problemi, ma in altre parti del sito devo instanziare una classe che esegue operazioni sui contenuti e su dati provenienti da un form, e che dovrebbe utilizzare alcuni metodi delle altre classi.
    mi viene in mente solo 2 soluzioni. La prima è passare l'istanza delle classi connessione-sessione-permessi a quella nuova e trovarmi tutti i metodi a disposizione, e la seconda è quella di creare una classe per la gestione dei contenuti che estende quella della connessione.

    Nella prima soluzione ho il vantaggio che creo una sola connessione al db e tutti i metodi delle altre classi sono a disposizione, ma come tecnica non credo sia la migliore.

    Nella seconda soluzione invece creo una nuova istanza con una nuova connessione al db, soluzione più pulita, ma se ho bisogno di dati della altre classi non me li ritrovo.

    Voi che tecniche utilizzate? Io mi sto impallando anche con le interfacce.

  2. #2
    Fai una "super classe" di gestione che si occupa di istanziare le connessioni al db, caricare le librerie di base (es. la classe di gestione che scrive/legge/aggiorna il db) e di fare tutti i lavori di base (recupero dei cookie, individuazione del browser e compagnia bella).
    Crei una pagina index.php che è lo "smistatore" degli eventi dell'interfaccia grafica (diciamo un controllore che decide cosa fare in base a cosa l'utente chiede di "vedere").
    Questo controllore inizializza la super classe che poi passi per referenza alle altre classi/gestori/controllori che ti servono.
    La super classe contiene in sue variabili le connessioni al db, i cookie eccetera, che quindi avrai sempre a disposizione nelle altre classi.


  3. #3
    In realtà quello hai detto l'ho sempre fatto, non so se sia la logica migliore, o se conviene creare più connessioni al db, in base alle esigenze delle varie classi chiudendo le connessioni non più necessarie.

  4. #4
    Non ha senso usare una connessione per ogni query o classe, è uno spreco di risorse inutile.
    Crei una connessione all'inizio dell'elaborazione e la "distruggi" alla fine

  5. #5
    In pratica quello che ho fatto fino a questo momento, sto solo aggiungendo interfacce ed eccezioni.
    Grazie.


  6. #6
    Utente di HTML.it L'avatar di garakkio
    Registrato dal
    Dec 2011
    residenza
    Roma
    Messaggi
    480
    Originariamente inviato da Dascos
    Fai una "super classe" di gestione che si occupa di istanziare le connessioni al db, caricare le librerie di base (es. la classe di gestione che scrive/legge/aggiorna il db) e di fare tutti i lavori di base (recupero dei cookie, individuazione del browser e compagnia bella).
    Crei una pagina index.php che è lo "smistatore" degli eventi dell'interfaccia grafica (diciamo un controllore che decide cosa fare in base a cosa l'utente chiede di "vedere").
    Questo controllore inizializza la super classe che poi passi per referenza alle altre classi/gestori/controllori che ti servono.
    La super classe contiene in sue variabili le connessioni al db, i cookie eccetera, che quindi avrai sempre a disposizione nelle altre classi.

    In questo modo istanzi tutte le classi, anche quando non ti servono. Questo non è proprio il massimo dell'efficienza.
    Partendo dall'assunto di base che sia meglio iniettare le dipendenze (che vuol dire semplicemente passare le classi ai costruttori delle altre classi) piuttosto che estendere le classi, la cosa migliore in questo caso è costruire un contenitore di servizi (o Dependency Injector Container). La cosa non è propriamente banale, quindi io consiglio di usare o quello di Zend Framework, che però non è ancora stabile, oppure quello di Symfony

  7. #7
    Originariamente inviato da garakkio
    In questo modo istanzi tutte le classi, anche quando non ti servono. Questo non è proprio il massimo dell'efficienza.
    Partendo dall'assunto di base che sia meglio iniettare le dipendenze (che vuol dire semplicemente passare le classi ai costruttori delle altre classi) piuttosto che estendere le classi, la cosa migliore in questo caso è costruire un contenitore di servizi (o Dependency Injector Container). La cosa non è propriamente banale, quindi io consiglio di usare o quello di Zend Framework, che però non è ancora stabile, oppure quello di Symfony
    Affatto, non istanzi tutte le classi ma solo quelle strettamente necessarie (connessione al db, gestore cookie, classe che costruisce le query di update/insert/delete/select e poco altro).
    Questa super classe la passi a quelle che servono, che ovviamente istanzi quando servono, per referenza.

  8. #8
    Originariamente inviato da garakkio
    In questo modo istanzi tutte le classi, anche quando non ti servono. Questo non è proprio il massimo dell'efficienza.
    Partendo dall'assunto di base che sia meglio iniettare le dipendenze (che vuol dire semplicemente passare le classi ai costruttori delle altre classi) piuttosto che estendere le classi, la cosa migliore in questo caso è costruire un contenitore di servizi (o Dependency Injector Container). La cosa non è propriamente banale, quindi io consiglio di usare o quello di Zend Framework, che però non è ancora stabile, oppure quello di Symfony
    Diciamo che non instanzio tutte le classi, sicuramente vengono instanziate quelle basi, cioè mysql, sessioni e permessi. queste classi servono sempre e in tutto il progetto. Poi instanzio le altre in base alla sezione che sto visualizzando. Il dubbio mi è sorto in queste sezioni, tali classi devono utilizzare alcuni metodi che si trovano nelle classi basi, quindi non sapevo se il mio modo di fare, cioè passare l'instanza base come riferimento, fosse corretto.
    Comunque guardo i link che mi hai dato e cerco di capire la soluzione migliore.

  9. #9
    Originariamente inviato da garakkio
    In questo modo istanzi tutte le classi, anche quando non ti servono. Questo non è proprio il massimo dell'efficienza.
    Partendo dall'assunto di base che sia meglio iniettare le dipendenze (che vuol dire semplicemente passare le classi ai costruttori delle altre classi) piuttosto che estendere le classi, la cosa migliore in questo caso è costruire un contenitore di servizi (o Dependency Injector Container). La cosa non è propriamente banale, quindi io consiglio di usare o quello di Zend Framework, che però non è ancora stabile, oppure quello di Symfony
    Permetto che utilizzare un framework trovo che sia una buona cosa ma nn sempre necessaria.

    Per facilitare inclusioni o istanze solo dove/qualora sono necessarie la miglior cosa da fare con php5 credo sia l'autoloading.

    esempio:
    Codice PHP:
    <?php
    function __autoload($class) {
        require_once(
    $class '.class.php');
    }
     
    $class1 = new MyClass1(); 
    $class2 = new MyClass2(); 
    ?>
    http://www.miniscript.it
    Se ti sono stato di aiuto in qualche modo in questo forum iscriviti alla fan page di Miniscript - il mio blog di programmazione web.

  10. #10
    Utente di HTML.it L'avatar di garakkio
    Registrato dal
    Dec 2011
    residenza
    Roma
    Messaggi
    480
    Rispondo a tutti, in ordine sparso:

    - l'autoloader è uno strumento, né più né meno di require/include (che dovrebbe sostituire in toto). Non è un modo per gestire le dipendenze tra le classi
    - non esistono classi indispensabili (se non quella dell'autoloader). Per dirne una, il database non dovrebbe assolutamente essere indispensabile, quindi caricarne ogni volta la classe (o le classi) non è bello
    - un framework serve sempre. Se uno ha investito del tempo per impararlo, non esiste alcun motivo al mondo per non usarl
    - per favore non parliamo di "referenza" (dovrebbe tradurre "reference"? Forse meglio "riferimento", allora), perché per fortuna php 4 è morto nel 2008 e oggi tutti gli oggetti sono passati tramite reference.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.