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

    riorganizzazione pagina php con classi

    (posto di nuovo questo thread semplificandolo in modo forse da renderlo piu' leggibile)

    Sto iniziando a usare la progr. ad oggetti in php5 (ho fatto qcosina in java ma poco)
    Dunque vorrei trasformare una pagina che ho fatto utilizzando le classi.
    Vi dico come ho pensato la cosa e ditemi se son proprio fuori strada o meno.

    innanzi tutto ecco come è fatta la pagina ora(ho cercato di suddividerla in sezioni seguendo un minimo di logica per avere unpo' di chiarezza)

    sezione 1: una serie di controlli su dei parametri che arrivano nell'url;in caso negativo fermo lo script altrimenti stampo un messaggio (qui nessuna operazione sul db)

    sezione2: collegamento al db

    sezione 3:viene fatta una select sul db che estrae una serie di dati di alcuni utenti(tra cui la mail) e parte un ciclo while; all'interno di questo ciclo ho individuato 2 sottosezioni della 3


    sezione 3 sottosezione 1:istanzio un oggeto htmlMimeMail(http://www.phpguru.org/static/mime.mail.html) e invio una mail all'indirizzo ricavato tramite la select della sezione 3(non vi preoccupate non faccio spamming, giuro!!! :-) ).(oppure tale oggetto lo istanzio prima del ciclo e qui uso solo il suo metodo)


    sezione 3 sottosezione 2: eseguo un INSERT nel db per scrivere che ho inviato la mail X,Y

    finito il ciclo della sezione 3 lo script è praticamente finito

    ****************************************
    ****

    organizzazione con classi nella pagina

    istanzio un oggetto della classe Controllo e chiamo il metodo eseguiControlli che mi esegue i controlli che appunto facevo nella sezione 1

    istanzio un oggetto($oggetto_connessione) della classe Connessione che si connette al DB e ha un metodo get() che restituisce appunto la connessione in modo che le altre classi la possano usare; nel metodo __destruct della classe Connessione chiudo la connessione

    a questo punto nella pagina tramite un'istruzione $mia_connessione=$oggetto_connessione->get_connectionDB() ho a disposizione la connessione

    istanzio un oggetto della classe ClassePrincipale(le passo la connessione) e chiamo un metodo che appunto esegue una select e fa partire il ciclo; in questo metodo vengono istanziati i 2 oggetti delle Classi(compresa htmlMimeMail) che svolgono le sottosezioni della sezione 3 e vengono chiamati i metodi relativi all'interno del ciclo.

    Che ve ne pare??

    Accetto tutte le critiche del mondo ma cercate di essere semplici che per me è la prima volta che programmo ad oggetti in php5.

    grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    460
    Stai sbagliando approccio. Un oggetto ha senso se rappresenta qualcosa di concreto, non e' una aggregazione di funzioni.

    Esempi: un oggetto e' una pagina HTML, un altro oggetto e' una connessione a un database. Gli oggetti rappresentano una astrazione di una entita' precisa, completa e chiusa del mondo reale che vuoi modellare.

    Se devi chiamare un metodo per fare una cosa, non devi istanziare un oggetto per farlo. Devi chiamare un metodo di un oggetto se quell'oggetto richiede che il metodo xyz venga eseguito su di se'. L'operazione "esegui l'azione", se non e' riferita a una istanza specifica di un oggetto, va eseguita con metodi statici, che sono l'equivalente delle funzioni di PHP.

    Un oggetto e' formato da proprieta' che ne definiscono lo stato e da metodi che ne definiscono il comportamento. Un oggetto e' una entita' reale che interagisce con il mondo esterno tramite le proprie interfacce e cambia il proprio stato in base all'interazione con l'esterno, non una serie di funzioni slegate e raggruppate per questioni logiche. Infatti, una classe definsce, giustappunto una CLASSE di oggetti, mentre una istanza rappresenta esattamente uno specifico (oggetto) appartenente a quella classe.
    There are 10 types of people in the world - those who understand binary and those who don't.

  3. #3
    Originariamente inviato da frinkia
    ...
    penso e spero di aver capito cosa intendi, hai spiegato molto bene.

    quindi per la mia pagina è forse meglio usare delle funzioni giusto??

    ma almeno la classe Connessione di cui ho parlato non mi sembra tanto sbagliata(anche secondo quanto dici tu). no?
    potrei fare quella e il resto gestirlo con delle funzioni

    grazie

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    460
    Assolutamente.

    Per visualizzare una pagina di solito si eseguono una serie di operazioni che hanno forte natura sequenziale e che spesso mal si prestano ad essere rappresentate tramite classi (a meno di casi particolari). Cio' che invece contribuisce a generare la pagina e' molto spesso rappresentabile come una istanza di una qualche classe.

    Ti faccio un esempio classico: un CLIENTE e' un tipico concetto della realta' che si presta ad essere rappresentato tramite un oggetto. Quando sviluppi a oggetti poniti due domande, una volta identificato l'oggetto:

    A) Quali sono le caratteristiche di questo oggetto?
    B) Quali comportamenti di questo oggetto sono possibili o voglio rappresentare?

    Le risposte alla domanda A saranno le proprieta' del tuo oggetto, e quelle alla domanda B ne saranno i metodi.

    Esempio: un cliente ha un nome, un cognome, una partita iva, un codice cliente e cosi' via. Queste sono le proprieta' del'oggetto cliente. Allora prendi la classe di entita' che vuoi rappresentare, e crei una bella class con tante proprieta' quante sono quelle che ti interessa modellare:

    codice:
    public class Cliente {
        private $nome;
        private $cognome;
        private $partitaIva;
        private $codiceCliente;
    
    public function getNome() {
        return nome;
    }
    
    public function setNome($nome) {
        $this->nome = $nome;
    }
    
    
    public function getCognome() {
        return $this->cognome;
    }
    
    public function setCognome($cognome) {
        $this->cognome = $cognome;
    }
    
    // Qui ci sono gli altri campi che ometto
    
    }
    Adesso hai un bella classe chiamata Cliente. Una istanza di questa classe (di oggetti) rappresentera' uno specifico cliente (mentre la classe definisce il comportamento e le proprieta' di quella realta' che hai voluto modellare). Per istanziarlo non fai altro che fare:

    codice:
    $nuovoCliente = new Cliente();
    Nella classe di cui sopra ci sono alcune cose importanti che ti consiglio di fare sempre: in primis, tutte le proprieta' sono dichiarate private. Questo implica che per modificare lo stato interno devi utilizzare uno dei metodi appositi, e non puoi cambiare lo stato a mano da fuori, ma e' l'oggetto che attraverso una interfaccia esterna ti dice quale operazioni e' in grado di effettuare. Questo sistema garantisce cio' che si chiama protezione dei dati o incapsulamento. Che vantaggi ti porta? Semplice: tramite i metodi cosiddetti "getter" e "setter" puoi fare in modo che lo stato dell'oggetto non sia mai uno stato non valido.

    Ad esempio, un cliente in base al tuo modello dei dati non puo' non avere un cognome. Supponiamo di avere dichiarato l'oggetto con dei campi pubblici (male!):
    codice:
    public class Cliente {
        public $nome;
        public $cognome;
        public $codiceCliente;
        public $partitaIva;
    }
    Questo oggetto tu lo puoi istanziare esattamente come prima:
    codice:
    $nuovoCliente = new Cliente();
    e per cambiarne il cognome puoi fare:
    codice:
    $nuovoCliente->cognome = "Baggio";
    Pero' puoi anche fare:
    codice:
    $nuovoCliente->cognome = "";
    e se questo viola una tua condizione sullo stato possibile dell'oggetto, sei nei guai. Ad esempio, l'oggetto cliente deve potere essere salvato su database in qualunque momento, e la colonna corrispondente al campo cognome e' definita come NOT NULL. Se tu fai $cliente->save(); (ipotetica funzione che salva su database), la chiamata fallisce.

    Invece, e' corretto proteggere i campi impostandoli come privati e poi imporre i vincoli sul cambiamento di stato sui metodi che definiscono, come gia' detto, il comportamento.

    codice:
    public class Cliente {
        private $cognome;
        public function setCognome($cognome) throws IllegalArgumentException {
            if ($cognome == "")
                throw new IllegalArgumentException("Cognome non valido");
            $this->cognome = cognome;
        }
    }
    Questo modo di ragionare ti permette di fare si' che una volta che la classe Cliente e' completa e scritta in modo protetto, errori nel codice esterno alla classe stessa non si possano propagare nella tua classe, che utilizzando incapsulamento / protezione dei dati, una volta priva di bug e' inattaccabile.
    There are 10 types of people in the world - those who understand binary and those who don't.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    460
    Quello che spero di averti fatto capire della programmazione a oggetti e' che e' un modo completamento diverso (e migliore) di ragionare.

    Non devi piu' ragionare nei termini di "cosa devo fare" (ovvero di program flow da inizio a fine), ma prima di "quali entita' devo rappresentare". Quindi non devi piu' sederti alla scrivania e iniziare a rappresentare cosa vuoi fare, ma devi iniziare a creare una astrazione, una rappresentazione, di un insieme di entita' del mondo reale che interagiscono fra loro in modi predefiniti.

    Una connessione e' un ottimo esempio di classe di oggetti, in quanto ha uno stato (connesso, disconnesso, targetHost, targetPort, currentUser, currentPassword), e una serie di comportamenti che puo' effettuare (executeQuery, executeUpdate, executeDelete, flush(), close(), etc).

    Cio' che invece e' un pessimo esempio di classe sono le funzioni matematiche. Che senso ha una classe per la funzioen seno, o coseno? Che senso ha dire che esiste un oggetto "seno"? Non esiste, in quanto non ha uno stato, ne' ha comportamenti. E' solo una funzione matematica che dato un valore di ingresso ne restituscie uno in uscita. Questo e' il classico candidato per un metodo statico. In caso non sapessi, un metodo statico e' un metodo che si puo' invocare su una classe e non su una sua istanza. Tipicamente, tante operazioni 'statiche' vengono agglomerate in classi dette "utility class" che sono un agglomerato di metodi statici che fanno cose non mettibili altrove.

    Ad esempio, un classico e' la classe Math di Java che contiene una lunga serie di metodi statici, come ad esempio Math.sin(), Math.cos(), Math.abs() e cosi' via.

    La cosa piu' importante, comunque, e' che se intendi programmare a oggetti (e te lo consiglio, e' una via senza ritorno) devi iniziare a pensare a modellare e astrarre gli OGGETTI (inteso in senso concreto, non in senso informatico) che vuoi rappresentare, e non la sequenza di operazioni.
    There are 10 types of people in the world - those who understand binary and those who don't.

  6. #6
    ok domani rielaboro qualcosa e rispondo grazie

  7. #7
    Ti ringrazio anche io mi hai chiarito molti punti oscuri della programmazione ad oggetti.

    @Prazision

    Se vai su freephp.it ci sono molti articoli che spiegano la programmazione ad oggetti ed uno di questi crea proprio un insieme di oggetti er validare i form. Ciao!
    eCommerceRS.NET - Commerciante, vendi on-line!
    Il mio nick è mircov e non mirco!!!

  8. #8
    grazie mircov e grazie frinkia

    mi pare di capire quindi che nella mia pagina è conveniente rappresentare con delle classi solo la connessione che ha come proprietà private i propri parametri e 2 metodi; il primo appunto è quello della connessione e il secondo è quello che la restituisce. nel metodo __destruct della classe Connessione chiudo la connessione.

    il resto è meglio gestirlo con delle normali funzioni di PHP(non legate a nessuna classe, funzioni che che corrispondono ai metodi statici in Java)

    frinkia ha anche detto 'un oggetto e' una pagina HTML' e poi 'Cio' che invece contribuisce a generare la pagina e' molto spesso rappresentabile come una istanza di una qualche classe.'
    forse dunque c'era una maniera conveniente(diversa da come avevo impostato io il tutto) per rappresentare tutta la mia pagina con delle classi??

    grazie

  9. #9
    in realtà la pagina non si rappresenta con una classe. Questa impostazione cmporterebbe la creazione di una classe per ogni pagina che vuoi creare.

    in realtà la agina usufruisce delle classi per poterti far ottenere ciò che vuoi.

    Devi pensare alle classi (che in realtà, in questo caso si chiamano oggetti) cme a degli strumenti per raggiungere uno scopo.

    una classe non è altro che una rappresentazione astratta di un problema. Che vuol dire questo?

    Vuol dire che se vuoi fare l'upload di un file tramite form con l'approccio procedurale dovrai scrivere ogni volta il codice necessario. Con una classe ti basterà, invece, scrivere

    $obj->upload() ;

    Tu hai scritto solo poche lettere ma all'interno della classe verrà eseguito molto codice come può essere eseguito pochissimo codice. Tu non lo sai, sai solo che alla fine il file viene caricato dove tu vuoi che venga caricato.

    Mi dirai "e se uso na funzione non è la stessa cosa?". io ti rispondo no.

    mettiamo il cas che tu, a secnda del tipo di file caricato, volgia comportarti in maniera differente.

    Ti faccio un esempio.

    Hai un sito di immagini. Queste immagini vengono caricate tramite form. L'utente, però ha sia possibilità di caricare un'immagine che quella di caricare un file zip contenente delle immagini.

    Ne risulta che, ne caso in cui venga caricata un'immagine, tu vuoi che la stessa venga ridimensionata. Se invece viene caricato un file zip vuoi prima estrarre le immagini e poi ridimensionarle.

    Come fare?

    Con un approccio procedurale sei tu a dover implementare le varie funzioni nel codice.

    Con le classi, invece, avrai:

    1) La classe che effettua l'upload (class upload)
    2) La classe che effettua il ridimensionamento (class resizer)
    3) La classe che estrae i dati dal file zip (class zipHandler)
    4) Una classe che gestisce il tutto (class driver)

    Cosa succede?
    Succede che tu userai la classe driver alla quel passerai il nome del file. Farai quindi qualcosa del genere:

    $driver->upload( 'nome_file.ext' ) ;

    Basta. non dovrai fare più niente.

    La classe automaticamente vedrà che tipo di file è. Se il file è un'immagine la ridimensiona, se è un file zip estrae le immagini e poi le ridimensiona.

    Ovviamente le classi dovranno essere prorammate in modo da poter interagire tra loro ma alla fine tu dovrai scrivere solo uncomando per fare una marea di operazioni. Questo è il vantaggio derivante dalle classi e dalla conseguente oop.

    Scrivi il cidice una volta e poi hai fatto.

    ovviamente qesto ti farà perdere un po' più di tempo la prima volta che affronti un problema ma ti ripagherà facendotene risparmiare moltissimo ogni volta che avrai bisogno di usare quella funzione.

    in pratica ti costruisci da solo gli strmenti che ti servono cercando di renderli il più generalizzati possibile er poterli utilizzare il maggior numero di volte e nei casi più disparati. (ovviamente non potrai costruire una classe per l'upload e per generalizzarla ci metti dei metodi che mandino e-mail!).
    eCommerceRS.NET - Commerciante, vendi on-line!
    Il mio nick è mircov e non mirco!!!

  10. #10
    ok grazie, questi esempi mi son chiari e utili ma mi interessava il mio caso; ripeto: "in un caso come il mio è conveniente rappresentare con delle classi solo la connessione che ha come proprietà private i propri parametri e 2 metodi; il primo appunto è quello della connessione e il secondo è quello che la restituisce. nel metodo __destruct della classe Connessione chiudo la connessione.
    il resto è meglio gestirlo con delle normali funzioni di PHP(non legate a nessuna classe, funzioni che che corrispondono ai metodi statici in Java) "

    è giusto??

    o qualcuno vede la possibilità di usare anche altre classi??
    se qualcuno vede tale possibilità come oprganizzaerebbe queste classi??

    grazie tantissimo

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.