UdA 5 La gestione dei dati in PHP lezione 3 gli oggetti in php • In questa lezione impareremo... • a conoscere il paradigma a oggetti in PHP • a creare classi, metodi e proprietà • a istanziare oggetti ■■ Il paradigma a oggetti in PHP PHP implementa il ◀ paradigma degli oggetti (Object Oriented Paradigm) ▶anche se è un linguaggio a carattere misto, sia procedurale che a oggetti. ◀ Object Oriented Paradigm Is a programming paradigm that uses objects to design applications and computer programs, it models the real world. This includes some unique concepts which overcome the drawbacks of fellow programming paradigms. In OOP (Object Oriented Programming) the emphasis is on data and not on procedures. ▶ Per la creazione di una nuova classe di oggetti, si deve utilizzare il costrutto class, all’interno del quale possiamo collocare i metodi e le proprietà, rappresentate rispettivamente da funzioni e variabili. Tuttavia le proprietà devono essere dichiarate anteponendo chiave var. Esempio35 Una classe carrello della spesa Nel codice che segue vediamo come realizzare una classe Carrello con due proprietà rappresentate da due array che contengono gli articoli presenti nel carrello e la relativa quantità. Vi sono poi quattro metodi, uno che aggiunge a un ipotetico carrello alcuni ordini di articoli, chiamato aggiungi_carrello(), un altro che elimina un elemento dal carrello (togli_carrello()), quindi il metodo aggiorna() effettua l’aggiornamento di un prodotto in termini di quantità, infine il metodo stampa() mostra a video tutti gli elementi dell’oggetto carrello, cioè quanto inserito nella nostra borsa della spesa virtuale. Il file è salvato con il nome esempio35.php: Incominciamo a vedere il codice del metodo che aggiunge nuovi articoli. Innanzi tutto vengono dichiarati due attributi (righe 5-6) come array. Il metodo aggiungi_carrello() riceve come parametro il nome dell’articolo da aggiungere e la quantità. Dopo aver letto la dimensione dell’array attraverso la funzione predefinita count (riga 11) viene effettuato un ciclo (riga 14) per verificare se l’elemento è presente (riga 17), in caso positivo viene chiamata la funzione aggiorna (riga 22) che provvederà ad aggiornare la quantità del prodotto passato come parametro insieme alla nuova quantità. Se l’elemento non è presente viene aggiunto ai due array (righe 26-27). 2 P. Camagni, R. Nikolassy, Progettare i database, Nuova Edizione OPENSCHOOL, © Ulrico Hoepli Editore S.p.A. 2014 Gli oggetti in PHP Lezione 3 Come possiamo notare davanti al nome del metodo è stato anteposto l’operatore di auto referenza $this e la notazione trattino freccia (->). L’operatore di auto referenza serve per indicare che il metodo appartiene alla classe. Il codice seguente è relativo al metodo togli_carrello(): P. Camagni, R. Nikolassy, Progettare i database, Nuova Edizione OPENSCHOOL, © Ulrico Hoepli Editore S.p.A. 2014 3 UdA 5 La gestione dei dati in PHP Il metodo riceve come parametro il nome dell’articolo da eliminare (riga 31) e viene cercato nell’array articoli mediante un ciclo (riga 36). Se l’elemento è presente viene salvata la posizione nella variabile posizione (riga 41). Se l’elemento è presente (riga 44) viene effettuato un ciclo (righe 4856) per copiare gli elementi degli array articoli e quantita negli array temporanei (app_ar e app_qt) escludendo l’elemento da cancellare (riga 50). A quel punto vengono eliminati gli array articoli e quantita (righe 52-53) e quindi nel ciclo successivo (righe 61-66) vengono ripristinati i contenuti delle proprietà della classe (quantita e articoli). Il codice seguente è relativo al metodo aggiorna(): Come possiamo vedere questo metodo riceve due parametri ($n e $q) che rappresentano il nome del prodotto da cercare e la quantità alla quale aggiornarlo. Il ciclo (riga 74) ricerca la presenza dell’elemento nell’array, quando l’elemento è stato trovato (righe 77-78) viene salvata la posizione. Le istruzioni (righe 81-82) aggiornano la quantità di posizione salvata nella variabile $posizione al valore ricevuto dal metodo. Infine se l’elemento non viene trovato (riga 83) viene stampato un messaggio di errore. Il codice seguente è relativo al metodo stampa(). Questo metodo è assai semplice ed effettua un ciclo per visualizzare gli elementi del carrello contenuti nei due array articoli e quantita (righe 88-93): Il file esempio35_test.php (codice a fianco) effettua l’istanza della classe Carrello. Prima di tutto però lo script include il file esempio35.php che contiene il codice relativo alla classe da istanziare (riga 3). L’istanza della classe Carrello avviene per mezzo dell’operatore new (riga 5). L’invocazione dei metodi avviene nel codice che segue: come possiamo notare do4 P. Camagni, R. Nikolassy, Progettare i database, Nuova Edizione OPENSCHOOL, © Ulrico Hoepli Editore S.p.A. 2014 Gli oggetti in PHP lezione 3 po il nome dell’oggetto ($acquisti) viene scritto il metodo secondo la notazione chiamata brackets notation, rappresentata da una freccia formata da un trattino e dal simbolo maggiore (->). Il codice seguente è nel file esempio35_test.php: L’esecuzione dello script che istanzia un oggetto di classe Carrello (esempio35_test.php) è mostrato nella seguente finestra: Prova adesso! • Utilizzare le classi • Istanziare oggetti • Usare metodi e proprietà AprI Il FIle esempio35_test.php Modifica il file esempio35_test.php in modo che mostri all’utente una pagina in cui può scegliere se aggiungere, cancellare o aggiornare i prodotti dall’elenco della spesa virtuale, quindi a ogni aggiunta o eliminazione visualizzare quanto presente nel carrello. P. Camagni, R. Nikolassy, Progettare i database, Nuova Edizione OPENSCHOOL, © Ulrico Hoepli Editore S.p.A. 2014 5 UdA 5 La gestione dei dati in PHP ■■ L’ereditarietà Secondo il concetto di ereditarietà della OOP (Object Oriented Programming) le classi possono essere estese ad altre classi, le classi “estese” possiedono tutte le proprietà e i metodi della classe base oltre a quello che viene aggiunto nella definizione estesa. PHP non possiede tuttavia, come ad esempio in C++, l’ereditarietà multipla. La parola riservata per definire una estensione di classe, come in Java, è extends. La sintassi seguente mostra una classe MioCarrello che eredita dalla classe Carrello e la estende aggiungendone un metodo (setPrezzo): class MioCarrello extends Carrello { //definizione di una nuova proprietà var $prezzi=array(); function setPrezzo($a,$p) { //ciclo di ricerca del prodotto for ($i=0;$i<count($this->articoli);$i++) { //Verifico se il prodotto è presente nel carrello salvo la posizione if ($this->articoli[$i]==$a) { $this->prezzi[$i]=$p; } } } } Viene definita una classe MioCarrello che eredita tutte le variabili e le funzioni di Carrello e in più una proprietà addizionale rappresentata dall’array associativo $prezzi e dal metodo setPrezzo. In tal modo possiamo memorizzare nell’oggetto il prezzo dell’articolo all’interno dell’array parallelo $prezzi. Se istanziamo un oggetto di classe MioCarrello possiamo ancora utilizzare i metodi definiti per la classe base: //Istanzio un nuovo oggetto della nuova classe derivata $nuovo_c = new MioCarrello; //Aggiungo un articolo $nuovo_c->aggiungo_carrello(“Acquarello”,3); //Aggiungo il prezzo all’articolo Acquarello $nuovo_c->setPrezzo(“Acquarello”,12); Il costruttore I costruttori sono metodi di una classe, aventi il nome della stessa classe e richiamati automaticamente quando viene creata una nuova istanza della classe. Il codice che segue mostra come creare un costruttore per la classe Carrello: class Carrello { function Carrello($a,$b) { $this->aggiungi_carrello($a,$b); } } 6 P. Camagni, R. Nikolassy, Progettare i database, Nuova Edizione OPENSCHOOL, © Ulrico Hoepli Editore S.p.A. 2014 Gli oggetti in PHP Lezione 3 È stato definito un costruttore che inizializza la classe Carrello con l’articolo e le quantità passate come parametro al costruttore stesso. Ogni volta che viene istanziato un nuovo oggetto di classe Carrello con l’operatore new. Vediamo come istanziare una classe con il costruttore: //Istanza della classe con il costruttore al quale vengono passati due parametri $carrello=new Costruttore(“Cornice”,3); Nelle classi derivate, il costruttore della classe genitore non viene chiamato automaticamente quando viene chiamato il costruttore della classe derivata, quindi se vogliamo richiamare il costruttore della classe ereditata dobbiamo indicarlo espressamente. Esempio36 Una classe cronografo In questo esempio utilizziamo un classe per verificare la durata di esecuzione di uno script. La classe interessata utilizza due metodi StartStop e LapReset. L’implementazione di tali funzioni come metodi della classe si basa sulla funzione time() che restituisce il ◀ Timestamp ▶ di UNIX. La risoluzione di questo cronometro non è molto elevata (essendo di ben 1 secondo), e inoltre esso non tiene conto del tempo di esecuzione del solo processo, ma del tempo complessivo di esecuzione, infatti il metodo fermati() calcola la differenza tra l’ora di sistema di inizio processo e l’ora di fine. Questo script in pratica crea un nuovo oggetto chrono di classe Cronometro, che all’inizio è automaticamente resettato. Avvia quindi il cronometro (che restituisce il valore 0 all’inizio, proprio come un vero cronometro). ◀ Timestamp è una sequenza di caratteri che rappresentano una data in modo da renderla comparabile con un’altra per stabilirne l’ordine temporale. Nei sistemi operativi Unix-like, come ad esempio Linux il tempo viene rappresentato come offet in secondi rispetto alla mezzanotte (UTC) del 1° gennaio 1970, chiamata UNIX epoch (epoca). ▶ Otteniamo quanto mostrato a fianco: ▶ P. Camagni, R. Nikolassy, Progettare i database, Nuova Edizione OPENSCHOOL, © Ulrico Hoepli Editore S.p.A. 2014 7 UdA 5 La gestione dei dati in PHP Verifichiamo le competenze g Problemi 1 Definisci una classe Convertitore, in grado di convertire valute diverse, ad esempio Dollaro-Euro. Per il programma si richiede la scrittura di almeno un metodo per il calcolo, un metodo di stampa dei valori risultanti e la definizione di uno o più attributi privati ove memorizzare i dati. 2 Definisci una classe Libro contenente i seguenti attributi: nome del libro (array di caratteri), prezzo, numero di scaffale, numero di pagine, casa editrice. Inoltre definisci i seguenti metodi: inizializza mostra applicaSconto le quali, rispettivamente, hanno i seguenti compiti: • inizializzare i campi dati dell’oggetto classe • stampare tutti i dati dell’oggetto • diminuire del 10% il prezzo del libro in oggetto 3 Crea la classe Massimi che contiene i metodi max() e min(), che calcolano rispettivamente il valore massimo e minimo di due numeri passati come parametri. 4 Crea una classe Negozio con due costruttori che inizializzino lo stato dell’oggetto, dotato dei seguenti parametri: • proprietario • nomeNegozio 5 Crea una classe ContoCorrente che contiene tre costruttori che inizializzino lo stato dell’oggetto, dotato dei seguenti parametri: • nome • codiceConto • saldo 6 Crea la classe Prodotto utilizzando meno codice possibile con tre costruttori che inizializzino lo stato dell’oggetto, dotati dei seguenti parametri: • codice • descrizione; • codice • descrizione 7 Crea la classe Fattura utilizzando meno codice possibile con tre costruttori che inizializzino lo stato dell’oggetto, dotati dei seguenti parametri: cliente numeroProdotti cliente numeroProdotti 8 Definisci una classe LineaBus per rappresentare oggetti linea di autobus urbano con il numero identificativo, il nome dei due capolinea e con opportuni metodi d’istanza per la descrizione del suo percorso. 9 Definisci una classe Auto per rappresentare oggetti automobile con il nome della marca, il nome del modello, la targa e l’anno di immatricolazione e con opportuni metodi d’istanza. 10 Definisci una classe Studente per rappresentare oggetti studente con il cognome, il nome, il codice fiscale, il numero di matricola e con opportuni metodi d’istanza. 8 P. Camagni, R. Nikolassy, Progettare i database, Nuova Edizione OPENSCHOOL, © Ulrico Hoepli Editore S.p.A. 2014