glI oggettI In php

Transcript

glI oggettI In php
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