Upload
bruno-vitiello
View
217
Download
0
Embed Size (px)
Citation preview
7/27/2019 4_PHP_OOP
1/37
P a s q u a l e t t i V e r o n i c a
7/27/2019 4_PHP_OOP
2/37
2
personalizzato, non esistente fra i tipi tradizionali di PHP, ma creato da noi.
Gli oggetti sono formati principalmente da attributi e metodi.
Gli attributi sono delle variabili proprietarie dell'oggetto, semplici o complesse,uindi anche Arra o O etti.
I metodi invece, sono delle funzioni proprietarie dell'oggetto, e fra questi ce ne
sono ue mo to mportant ostruttor e struttor .
7/27/2019 4_PHP_OOP
3/37
3
(oggetto), PHP li rimpiazzer con dei metodi propri di default.
Il costruttoreverr chiamato automaticamente da PHP, ogni volta che verrcreato un oggetto (istanza), mentre il distruttore sar chiamato quando l'oggetto
verr distrutto, ossia quando non esiste pi alcun riferimento all'oggetto oppure
alla fine dello script.
',classe che abbia lo stesso nome di quest'ultima, oppure potete usare la parolachiave__construct().
7/27/2019 4_PHP_OOP
4/37
7/27/2019 4_PHP_OOP
5/37
-
5
,costruttore.
Il costruttore prende in input tre parametri ($n_nome, $n_cognome,n_ ata c e an r a memor zzare r spett vamente ne propr attr ut
($nome, $cognome, $datanascita), a cui acceder tramite la parolachiave this.
Con this l'oggetto pu richiamare i suoi attributi e metodi, in quantos n ca ogge o s esso.
Subito dopo this segue l'operatore di selezione -> che punta ad un
determinato attributo o metodo alla sua destra, appartenenteall'oggetto alla sua sinistra (this).
7/27/2019 4_PHP_OOP
6/37
-
6
,dell'attributo/metodo.
Infine troviamo il metodo stampaPersona() che semplicementestampa gli attributi dell'oggetto tramite il costrutto echo.
7/27/2019 4_PHP_OOP
7/37
-
7
.
Test
7/27/2019 4_PHP_OOP
8/37
-
" "
8
,parola chiave newseguita dal costruttore della classe con i rispettivi
parametri.
A seguire richiamiamo il metodo "stampaPersona()" con l'operatore- .
7/27/2019 4_PHP_OOP
9/37
-
" "
9
. ,attributi, il costruttore e il metodo, sono dichiarati con la parola chiave
public.
Questo ci consente di usarli e richiamarli liberamente nello script' .
La parola chiave public un modificatore di accesso, che serve astabilire che tipo di restrizioni si devono avere lavorando su quel dato.
7/27/2019 4_PHP_OOP
10/37
10
- ,possono essere utilizzati sia all'interno che all'esterno della classe
madre e di quelle derivate da essa (ereditariet)t s->mem ro oppure oggetto->mem ro
- ,
solo all'interno delle classi madri e derivate($this->membro)
private - I membri dichiarati private, possono essere utilizzati solo'
($this->membro)
7/27/2019 4_PHP_OOP
11/37
" "
11
,come public, il linguaggio ci consente di agire direttamente su di essi,
senza dover richiamare il costruttore ogni volta che dobbiamomo care un a r u o e s anza u en e :
$utente = new Persona("John", "Doe", "1-1-1970");
" "-
$utente->cognome = "Arnavisca";
->
// output = Nome : Santiago / Cognome : Arnavisca / Data di nascita : 1-
1-1970
7/27/2019 4_PHP_OOP
12/37
12
classe "Persona", avremmo ricevuto dal server un errore sollevato
dalla riga $utente->nome = "Santiago"; Avremmo ottenuto un errore equivalente anche utilizzando il
modificatore di accesso protected, in quanto protected stabilisce chel'attributo o metodo cos dichiarato u essere utilizzato solo
all'interno della classe, ma a differenza di private, ne consentel'utilizzo anche nelle classi derivate, argomento che tratteremo pi
.
7/27/2019 4_PHP_OOP
13/37
13
,sapere che per utilizzare un membro di una classe, un attributo o un
metodo, obbligatorio creare un'istanza di tale classe attraverso laparo a c ave new, come ustrato n prece enza.
" " " " " ", , - -
attributo e ogni metodo.
7/27/2019 4_PHP_OOP
14/37
' " "
14
, ,colori di base.Colore.php
7/27/2019 4_PHP_OOP
15/37
15
.E' sufficiente specificare il nome della classe seguito dai doppi due punti e il nome delmembro :test.php
7/27/2019 4_PHP_OOP
16/37
-
16
scuro, sar sufficiente assegnarvi tale valore all'inizio dello script, rendendo cos
effettiva la modifica in tutto il codice, senza peraltro modificare la classe che.
Nell'esempio che segue, utilizzeremo il metodo statico "stampaColore()" pervisualizzare i colori sul browser.
test.php
7/27/2019 4_PHP_OOP
17/37
'
17
, .Il modo corretto per accedervi dall'interno mediante il costrutto self:
7/27/2019 4_PHP_OOP
18/37
18
,essere modificati una volta dichiarati e definiti. Prendiamo nuovamente in esempio la classe"Colore" esaminandone un utilizzo con le costanti :
Colore.php
7/27/2019 4_PHP_OOP
19/37
19
dichiarazione.
I nomi delle costanti in PHP 5 sono sempre Case Sensitive, ed buona norma,non obbligatorio.
test.php
7/27/2019 4_PHP_OOP
20/37
'
20
,programmazione orientata agli oggetti, a cui si appoggiano altri
metodi avanzati di programmazione come ad esempio ilo mor smo o e ass stratte c e ve remo p avant .
'
sottoclassi) basate su classi gi esistenti (classi base osuperclassi).
Un grande vantaggio quello di poter riutilizzare il codice di una.
7/27/2019 4_PHP_OOP
21/37
'
21
flessibile, in quanto permette una generalizzazione molto pi forte di
un concetto, rendendo pi facile descrivere una situazione di vita reale.
Pensate alla classe base come ad un oggetto che descrive un concetto,
specializzazione di tale concetto, esteso mediante propriet e metodiaggiuntivi.
7/27/2019 4_PHP_OOP
22/37
Oggetti e Ereditariet:
Animale. h
22
7/27/2019 4_PHP_OOP
23/37
Oggetti e Ereditariet:
Cane. h
23
7/27/2019 4_PHP_OOP
24/37
Oggetti e Ereditariet:
24
7/27/2019 4_PHP_OOP
25/37
25
accesso protected, ossia pu essere utilizzato solo all'interno della
classe madreAnimale e all'interno di tutte le classi da essa derivate,qu n anc e ane e a na.
utilizzare parent:: invece di this, in questo modo accediamodirettamente alla classe base, allo stesso modo con cui self::vieneusa o a pos o s.
7/27/2019 4_PHP_OOP
26/37
26
.
7/27/2019 4_PHP_OOP
27/37
27
.
7/27/2019 4_PHP_OOP
28/37
28
.
7/27/2019 4_PHP_OOP
29/37
29
Il Polimorfismo la capacit di utilizzare un unico metodo in grado di
comportarsi in modo specifico quando applicato a tipi di datodifferenti.
ues o reso poss e graz e a ere ar e , c e consen e a e
sottoclassi di ridefinire i metodi ereditati dalla classe base.
Il linguaggio pu identificare una qualunque istanza della sottoclasse,come un'istanza della classe base, poich per il principio
e ere ar e , ogn so oc asse poss e e per na ura u e epropriet della classe base (attributi e metodi).
7/27/2019 4_PHP_OOP
30/37
Esem io
7/27/2019 4_PHP_OOP
31/37
31
per il nostro metodo ("zampe()"), ereditato direttamente dalla classe
baseAnimale.
Flessibilit della funzione esterna numeroZampe(), che sar in,
un secondo momento senza necessit di apportare modifiche allafunzione numeroZampe() o alle tre classi (Animale, Cane e Gallina).
7/27/2019 4_PHP_OOP
32/37
32
,new, veniva restituito l'oggetto stesso e questo veniva memorizzato
nella variabile specificata.
In PHP 5 invece, quando creiamo una nuova istanza ($oggetto =,
riferimento ad esso.
7/27/2019 4_PHP_OOP
33/37
'
33
,l'assegnazione avverr per riferimento poich l'istanza stessa contiene
solo un riferimento all'oggetto creato.
Se volete quindi creare una copia di un'istanza, dovrete clonarla.
dopo l'operatore di assegnazione "=".
7/27/2019 4_PHP_OOP
34/37
Esempio clonazione Oggetti
34
class Oggetto{public $valore;
public function Oggetto($v){$this->valore = $v;
}}
=
$istanza2 = $istanza1; // Assegnazione per riferimento$istanza3 = clone $istanza1; // Clonazione oggetto$istanza2->valore = 7; // Modifica anche $istanza1$istanza3->valore = 13;
echo $istanza1->valore; // Non stampa 5 ma 7
-echo $istanza3->valore; // Stampa 13
?>Clonando un oggetto, per definizione si crea una copia esatta di tale oggetto, quindi iriferimenti contenuti in esso saranno comunque copiati come tali, e dopo la clonazione
conterranno ancora il riferimento alla stessa risorsa di prima.
7/27/2019 4_PHP_OOP
35/37
Esempio clonazione Oggetti
35
onan o un ogge o, per e n z one s crea una cop a esa adi tale oggetto, quindi i riferimenti contenuti in esso saranno
conterranno ancora il riferimento alla stessa risorsa di prima.
7/27/2019 4_PHP_OOP
36/37
36
e c ass as ra e c perme ono spec care conesattezza quali classi e quali metodi devono
poter essere utilizzati.
La sottoclasse derivata da una classe astratta, dovrobbli atoriamente definire tali metodi astratti er far s chel'ereditariet venga accettata.
7/27/2019 4_PHP_OOP
37/37
zampe;
dichiarato, mentre ladefinizione avviene
abstract protected function suono();}class Cane extends Animale{
rettamente ne a c asse
derivata.
parent::Animale(4);
}
public function suono()" "
Dichiarando Cane senza ladefinizione di suono(),
}$rex = new Cane();$rex->numeroZampe(); // Stampa 4
avremmo o enu o un errore.
rex->suono ; ampa au?>