ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e...

37
PHP: OOP PHP: OOP Pasqualetti Veronica

Transcript of ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e...

Page 1: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

PHP: O

OP

PHP: O

OP

Pa

squ

ale

ttiV

ero

nica

Page 2: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Oggetti

Oggetti

Possiamo pensare ad un oggetto

come ad un tipo di dato più com

plesso e

2

Possiamo pensare ad un oggetto

come ad un tipo di dato più com

plesso e personalizzato, non esistente fra i tipi tradizionali di PH

P, m

a creato da noi.

Gli oggetti sono form

ati principalmente da attributie m

etodi.G

li attributisono delle variabili proprietarie dell'oggetto, semplici o com

plesse, quindi anche Array o O

ggetti.quindi anche Array o O

ggetti.

I metodiinvece, sono delle funzioni proprietarie dell'oggetto, e fra questi ce ne d

l

ii i C

i i D

ii

sono due molto im

portanti i Costruttorie i D

istruttori.

Page 3: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Oggetti

Oggetti

Se non definireteun costruttore

e un distruttoreper la vostra

classe

3

Se non definireteun costruttore

e un distruttoreper la vostra

classe(oggetto), PH

P lirimpiazzerà

con deimetodiproprididefault.

Il costruttoreverrà

chiamato

automaticam

enteda

PHP, ognivolta

cheverrà

creatoun oggetto

(istanza), mentre

ildistruttoresarà

chiamato

quandol'oggetto

verràdistrutto, ossia

quandonon esiste

piùalcun

riferimento

all'oggettooppure

allafine dello

script.

Per dichiarareun costruttore

è sufficientecreare

unafunzione

all'internodella

Per dichiarareun costruttore, è sufficiente

creareuna

funzioneallinterno

dellaclasse

cheabbia

lo stessonom

ediquest'ultim

a, oppurepotete

usarela parola

chiave_

_construct().

Page 4: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Oggetti: esem

pio Persona.phpO

ggetti: esempio Persona.php

<?php

4

<?phpclass Persona{

public $nome = ""; // attributo

public $cognome = ""; // attributo

bli $d

i

"" //

ibpublic $datanascita = ""; // attributo

public function Persona($n_nome, $n_cognom

e, $n_data) // costruttore{

$this->nome = $n

nome;

$this>nom

e $n_nom

e;$this->cognom

e = $n_cognome;

$this->datanascita = $n_data;}

bli f

i

() // d

public function stampaPersona() // m

etodo{

echo "Nom

e : " . $this->nome . "<br />\n";

echo "Cognome : " . $this->cognom

e . "<br />\n";echo "D

ata di nascita : " $this->datanascita "<br />\n";echo D

ata di nascita : . $this>datanascita . <br />\n

;}

}

?>

Page 5: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Persona.php -comm

entiPersona.php

comm

enti

�Il nom

e del file è uguale a quello della classe così com

e lo è il nome del

5

�Il nom

e del file è uguale a quello della classe, così come lo è il nom

e del costruttore.Il costruttore prende in input tre param

etri ($n_nome, $n_cognom

e, $

d)

h

i

ii

i

i ib

i $n_data) che andrà a m

emorizzare rispettivam

ente nei propri attributi ($nom

e, $cognome, $datanascita), a cui accederà tram

ite la parola chiave this.

�Con this

l'oggetto può richiamare i suoi attributi e m

etodi, in quanto thi

idi

l'tt

tthis

indica l'oggetto stesso.Subito dopo this

segue l'operatore di selezione ->che punta ad un

determinato attributo o m

etodo alla sua destra, appartenente all'oggetto alla sua sinistra (this).

Page 6: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Persona.php -comm

entiPersona.php

comm

enti

�Il sim

bolo del dollaro $ va solo su this

e non sul nome

6

�Il sim

bolo del dollaro $, va solo su thise non sul nom

e dell'attributo/m

etodo.

�Infine troviam

o il metodo stam

paPersona()che semplicem

ente stam

pa gli attributi dell'oggetto tramite il costrutto echo.

Page 7: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Persona.php -utilizzoPersona.php

utilizzo

testphp

7

test.php

<?php require_once("Persona.php"); ?><htm

l><head><title>Test</title></head><body><body><?php

$utente = new Persona("M

ario", "Rossi", "10-01-1980");

$utente->stampaPersona();

?></body></htm

l></htm

l>

Page 8: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Test.php -comm

entiTest.php

comm

enti

�Per creare una nuova istanza della classe "Persona"

abbiamo usato la

8

�Per creare una nuova istanza della classe "Persona", abbiam

o usato la parola chiave new

seguita dal costruttore della classe con i rispettivi param

etri.

�A seguire richiam

iamo il m

etodo "stampaPersona()"

con l'operatore di selezione ->

descritto in precedenza.di selezione >

descritto in precedenza.

Page 9: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Test.php -comm

entiTest.php

comm

enti

�O

sservando la classe "Personaphp"

possiamo notare che tutti gli

9

�O

sservando la classe "Persona.php", possiamo notare che tutti gli

attributi, il costruttore e il metodo, sono dichiarati con la parola chiave

public.

�Q

uesto ci consente di usarli e richiamarli liberam

ente nello script attraverso un'istanza della suddetta classe. attraverso un

istanza della suddetta classe. La parola chiave public

è un modificatore di accesso, che serve a

stabilire che tipo di restrizioni si devono avere lavorando su quel dato.

Page 10: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Public, Protected e PrivatePublic, Protected e Private

�public

I mem

bri (attributi o metodi) della classe dichiarati public

10

�public

-I mem

bri (attributi o metodi) della classe dichiarati public,

possono essere utilizzati sia all'interno che all'esterno della classe m

adre e di quelle derivate da essa (ereditarietà) ($

hib

$b

)($this->

mem

brooppure $oggetto->

mem

bro)

�protected

I mem

bri dichiarati protected possono essere utilizzati

�protected

-I mem

bri dichiarati protected, possono essere utilizzati solo all'interno delle classi m

adri e derivate ($this->

mem

bro)

�private

-I mem

bri dichiarati private, possono essere utilizzati solo all'interno della classe m

adre allinterno della classe m

adre ($this->

mem

bro)

Page 11: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Public, Protected e PrivatePublic, Protected e Private

�Tornando

allaclasse

"Persona"

poichèabbiam

odichiarato

gliattributi

11

�Tornando alla classe

Persona

, poichè abbiamo dichiarato gli attributi

come public, il linguaggio ci consente di agire direttam

ente su di essi, senza dover richiam

are il costruttore ogni volta che dobbiamo

difittib

td

ll'it

($tt

)m

odificare un attributo dell'istanza ($utente) :$utente = new

Persona("John", "D

oe", "1-1-1970");$utente

>nome

="S

antiago";$utente->nom

e = Santiago

;$utente->cognom

e = "Arnavisca";

$utente->stampaP

ersona();$utente

stampaP

ersona(); // output = N

ome : S

antiago / Cognom

e : Arnavisca / D

ata di nascita : 1-1-1970

Page 12: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Public, Protected e PrivatePublic, Protected e Private

�Se invece avessim

o usato la restrizione privateper gli attributi della

12

�Se invece avessim

o usato la restrizione privateper gli attributi della

classe "Persona", avremm

o ricevuto dal server un errore sollevato dalla riga $utente->nom

e = "Santiago";�

Avremm

o ottenuto un errore equivalente anche utilizzando il m

odificatore di accesso protected, in quanto protectedstabilisce che

l'attributo o metodo così dichiarato, può essere utilizzato solo

lattributo o metodo così dichiarato, può essere utilizzato solo

all'interno della classe, ma a differenza di private, ne consente

l'utilizzo anche nelle classi derivate, argomento che tratterem

o più avanti parlando della E

reditarietàavanti parlando della E

reditarietà.

Page 13: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Oggetti e M

embri statici

Oggetti e M

embri statici

�Prim

a di introdurre il concetto dei mem

bri statici è necessario

13

�Prim

a di introdurre il concetto dei mem

bri statici, è necessario sapere che per utilizzare un m

embro di una classe, un attributo

o un m

etodo, è obbligatorio creare un'istanza di tale classe attraverso la l

hi

ill i

d

parola chiave new, com

e illustrato in precedenza.

�$utente = new

Persona("John" "Doe" "1

11970");

�$utente = new

Persona(John

, Doe

, 1-1-1970);

�In questo m

odo, ogni istanza della classe avrà la propria copia di ogni �

In questo modo, ogni istanza della classe avrà la propria copia di ogni

attributo e ogni metodo.

Page 14: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Oggetti e M

embri statici

Oggetti e M

embri statici

Per capirem

eglio prendiam

oun esam

eun'ipotetica

classe"C

olore" che

avràuna

seriedi

14

Per capirem

eglio, prendiamo

un esame

unipotetica

classeC

olore, che

avràuna

seriedi

coloridibase.Colore.php<?php

class Colore{static $rosso

= "#FF0000";static $verde

= "#00FF00";static $blu

= "#0000FF";static $blu

= #0000FF;

/*.. altriattributi*/public function Colore(){ /* codice

costruttore*/ }

/*... altrimetodi*/

static public function stampaColore($colore){

echo "<font color=\"" . Colore::${$colore} . "\">Il valoreesadecim

aledel colore

$coloreè : ";

del colore$colore

è : ;echo Colore::${$colore} . "</font><br/>\n";}

}?>

Page 15: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Mem

bri statici –usare C

oloreM

embri statici

usare Colore

Vediamo

come è possibile

utilizzareitre

mem

bristaticidellaclasse

Colore

15

Vediamo

come è possibile

utilizzareitre

mem

bristaticidellaclasse

Colore.

E' sufficientespecificare

ilnome

dellaclasse

seguitodaidoppidue puntie ilnom

edel

mem

bro:

test.php<?php

require_once("Colore.php");

echo "<font color=\"" Colore::$rosso "\">Il valore

esadecimale

del colorerosso

echo <font color=\ . Colore::$rosso

. \>Il valore

esadecimale

del colorerosso

è : ";echo Colore::$rosso

. "</font><br/>\n";

echo "<font color=\"" . Colore::$verde. "\">Il valore

esadecimale

del coloreverde

è : ";echo Colore::$verde

. "</font><br/>\n";

echo "<font color=\"" . Colore::$blu. "\">Il valore

esadecimale

del coloreblu

è : ";echo Colore::$blu

. "</font><br/>\n";?>

Page 16: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Colore -com

menti

Colore

comm

enti

Se in un secondom

omento

decidiamo

cheper ilnostro

sitoè più

adattoun rosso

16

Se in un secondom

omento

decidiamo

cheper ilnostro

sitoè più

adattoun rosso

scuro, saràsufficiente

assegnarvitale valoreall'inizio

delloscript, rendendo

cosìeffettiva

la modifica

in tuttoilcodice, senza

peraltrom

odificarela classe

chepotrebbe

esserecondivisa

con altreapplicazionianche

esterneal server

potrebbeessere

condivisacon altre

applicazioniancheesterne

al server.N

ell'esempio

chesegue, utilizzerem

oilm

etodostatico

"stampaC

olore()"per

visualizzareicolorisulbrow

ser.test.php<?php

requireonce("Colore

php");require_once(

Colore.php);

Colore::stampaColore("rosso");

Colore::$rosso= "#C11C1C"; // R

ossopiù

scuroColore::stam

paColore("rosso");??>

Page 17: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

SelfSelf

Per accedereaim

embristaticidall'interno

dellaclasse

$thisnon è adeguato

17

Per accedereaim

embristaticidallinterno

dellaclasse, $this

non è adeguato. Il m

odocorretto

per accedervidall'internoè m

edianteilcostrutto

self:<?php

class Coloreclass Colore{

static $rosso= "#FF0000";

// ...// ...static public function stam

paColore($colore){

self::$rosso= "#FF0000";

$;

echo "<font color=\"" . Colore::${$colore} . "\">Il valore

esadecimale

del colore$colore

è : ";echo Colore::${$colore} . "</font><br/>\n";

}}

?>

Page 18: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Oggetti e costanti

Oggetti e costanti

Potetepensare

allecostantidelle

classi come a degliattributistaticiche

non possonoperò

18

Potetepensare

allecostantidelle

classi, come a degliattributistaticiche

non possonoperò

esserem

odificatiunavolta

dichiaratie definiti. Prendiamo

nuovamente

in esempio

la classe"C

olore"esam

inandoneun utilizzo

con le costanti:Colore.php<?php

class Colore{

const RO

SSO = "#FF0000";

const RO

SSO = #FF0000

;const VER

DE = "#00FF00";

const BLU = "#0000FF";

static public function stampaR

osso(){

echo "<font color=\"" . self::RO

SSO . "\">Il valore

esadecimale

del colorerosso

è : ";echo self::R

OSSO

"</font><br/>\n";echo self::R

OSSO

. </font><br/>\n;

}}

?>

Page 19: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Utilizzo delle costanti globali

Utilizzo delle costanti globali

Con le costantiglobaliè necessarioom

ettereilsim

bolodel dollaro

$durante

la

19

Con le costantiglobaliè necessarioom

ettereilsim

bolodel dollaro

$durante

la dichiarazione.I nom

idellecostantiin PH

P 5 sonosem

preCase Sensitive, ed

è buonanorm

ascriverle

tuttein m

aiuscoloper distinguerle

imm

ediatamente

come costanti m

a scriverle

tuttein m

aiuscoloper distinguerle

imm

ediatamente

come costanti, m

a non è obbligatorio.test.php<?php

requireonce("Colore

php");require_once(

Colore.php);

echo Colore::RO

SSO . "<br/>\n";

Colore::stampaR

osso();

??>

Page 20: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Oggetti ed E

reditarietàO

ggetti ed Ereditarietà

�Il concetto dell'ereditarietà

è uno dei più importanti della

20

�Il concetto dellereditarietà, è uno dei più im

portanti della program

mazione orientata agli oggetti, a cui si appoggiano altri

metodi avanzati di program

mazione com

e ad esempio il

Pli

fi l

Cl

i Ah

d

iPolim

orfismo

o le Classi A

stratteche vedrem

o più avanti.

�L'ereditarietà

ci consente di creare delle classi (classi derivateo

�L

ereditarietàci consente di creare delle classi (classi derivate

o sottoclassi) basate su classi già esistenti (classi base

o superclassi).

�U

n grande vantaggio è quello di poter riutilizzare il codice di una classe di base

senza doverlo modificare

classe di basesenza doverlo m

odificare.

Page 21: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Oggetti ed E

reditarietàO

ggetti ed Ereditarietà

�L'ereditarietà

ci consente quindi di scrivere del codice molto più

21

�L

ereditarietàci consente quindi di scrivere del codice m

olto più flessibile, in quanto perm

ette 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

generale e pensate invece alle sottoclassicom

e ad una generale, e pensate invece alle sottoclassicom

e ad una specializzazione di tale concetto, esteso m

ediante proprietà e metodi

aggiuntivi.

Page 22: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Oggettie E

reditarietà: esem

pio(1/3) –

classe“m

adre”esem

pio(1/3)

classem

adre

Animale.php

22

Animale.php

<?php

class Animale

// ClasseBase

{{public $zam

pe;public $ordine;public $nom

e;

public function Animale($z, $o, $n) // Costruttore

{$this->zam

pe= $z;

$this->ordine= $o;;

$this->nome

= $n;}protected function stam

paDati() // M

etodoprotetto

: puòessere

richiamato

solo dalle

classiderivatedalle

classiderivate{ echo $this->nom

e. " : Zam

pe= " . $this->zam

pe. " / O

rdine= " . $this->ordine;

}}

?>

Page 23: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Oggettie E

reditarietà: esem

pio(2/3) –

classeereditata

esempio

(2/3) classe

ereditata

Cane.php

23

Cane.php<?php

require_once("Animale.php");

l C

t

d A

il

// "Stt

l"

"ClD

it

"{class Cane extends Anim

ale// "Sottoclasse" o "Classe

Derivata"{

public function Cane() // Costruttoreclasse

derivata{

parent::Animale(4, "Vertebrati", "Cane"); // Chiam

ataal costruttore

dellaclasse

madre

dellaclasse

madre/* oppure

piùgeneralizzato

parent::__construct(4, "Vertebrati", "Cane"); */p

(4,,

);/

}public function stampaD

ati($suono){

echo "Faccio$suono

perchèsono

";echo Faccio

$suonoperchè

sono;

parent::stampaD

ati(); // Chiamata

al metodo

protettodella

classem

adre}

}}?>

Page 24: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Oggettie E

reditarietà: esem

pio(3/3) –

classeereditata

esempio

(3/3) classe

ereditata

Gallina.php

24

Gallina.php

<?php

require_once("Animale.php");

class Gallina

extends Animale

// "Sottoclasse" o "ClasseD

erivata"{

public function Gallina() // Costruttore

classederivata

{{parent::Anim

ale(2, "Vertebrati", "Gallina"); // Chiam

ataal

costruttoredella

classem

adre}public function stam

paDati($suono)

{echo "Faccio

$suonoperchè

sono";

parent::stampaD

ati(); // Chiamata

al metodo

protettodella

parent::stampaD

ati(); // Chiamata

al metodo

protettodella

classem

adre}

}

?>

Page 25: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Ereditarietà: com

menti all’esem

pioE

reditarietà: comm

enti allesempio

�Il m

etodo stampaD

atidi Anim

aleè dichiarato con il m

odificatore di

25

�Il m

etodo stampaD

atidi Anim

aleè dichiarato con il m

odificatore di accesso protected, ossia può essere utilizzato solo all'interno della classe m

adre Anim

alee all'interno di tutte le classi da essa derivate,

idi

h C

Glli

quindi anche Cane

e Gallina.

�Per richiam

are il costruttore della classe madre dalle figlie è sufficiente

�Per richiam

are il costruttore della classe madre dalle figlie è sufficiente

utilizzare parent::invece di this, in questo modo accediam

o direttam

ente alla classe base, allo stesso modo con cui self::viene

t

l t

di thiusato al posto di this.

Page 26: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Ereditarietà: utilizzo delle classi in esem

pioE

reditarietà: utilizzo delle classi in esempio

testphp26

test.php<?php

require_once("Cane.php");i

("Glli

h")

require_once("Gallina.php");

$cane = new Cane();

$cane->stampaD

ati("bau");$cane

>stampaD

ati(bau

);

echo "\n\n<br/><br/>\n\n";

$lli

G

lli()

$gallina= new

Gallina();

$gallina->stampaD

ati("chicchirichì");

?>?>

Page 27: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Sottoclasse derivata da una sottoclasseSottoclasse derivata da una sottoclasse

Alanophp

27

Alano.php<?php

require_once("Cane.php");class Alano

extends Cane{class Alano

extends Cane{private $suono;public function Alano(){{

parent::Cane();$this->suono

= "wuoff";

}}public function stampaD

ati(){

parent::stampaD

ati($this->suono);echo " / R

azza: Alano";

}}

?>

Page 28: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Utilizzare A

lanoU

tilizzare Alano

testphp

28

test.php<?php

require_once("Alano.php");

$cane = new Alano();

$cane->stampaD

ati();

?>

Page 29: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Polimorfism

oPolim

orfismo

29

�Il Polim

orfismo

è la capacitàdiutilizzare

un unicom

etodoin grado

dicom

portarsiin modo

specificoquando

applicatoa tipi didato

differenti.

�Q

ibili

ll'

diti

ht

ll�

Questo

è resopossibile

grazie all'ereditarietà, checonsente

allesottoclassidiridefinire

imetodiereditatidalla

classebase.

�Il linguaggio

puòidentificare

unaqualunque

istanzadella

sottoclasse, com

e un'istanzadella

classebase, poiché

per ilprincipio d

ll'dit

ità

i

ttl

id

t

ttt

l

dell'ereditarietà, ognisottoclassepossiede

per naturatutte

le proprietà

dellaclasse

base (attributie metodi).

Page 30: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Esem

piop

<?php}

30

<?phpclass Animale{/* R

endiamo protetto il m

etodo per obbligare una

ridefinizionein una

sottoclasse.Piùavanti per ottenere un risultato

}}function num

eroZampe($oggetto){

if($oggettoinstanceofAnim

ale) // m

igliore useremo le Classi Astratte. */

protected function zampe(){

echo"Errore : la funzione va

obbligatoriamente ridefinita da una

Condizione = Se oggetto è un istanza di Animale

o derivata da essa{

$oggetto>

ampe()

obbligatoriamente ridefinita da una

sottoclasse!";}

}

$oggetto->zampe();

}else{echo "Tipo di oggetto non

}class Cane extends Animale{

public function zampe(){

echo "Zampe

: 4";

pgg

riconosciuto!!";}

}}

}class Gallina

extends Animale{

public function zampe(){

numeroZam

pe(newCane()); // Stam

pa : "Zam

pe : 4"num

eroZampe(new

Gallina()); // Stam

pa : " Zam

pe : 2"public function zam

pe(){echo "Zam

pe: 2";

Zampe : 2

?>

Page 31: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Com

menti

Com

menti

�N

ell’ esempio possiam

o notare che abbiamo stabilito un nom

e univoco

31

�N

ell esempio possiam

o notare che abbiamo stabilito un nom

e univoco per il nostro m

etodo ("zampe()"), ereditato direttam

ente dalla classe base A

nimale.

�Flessibilità della funzione esterna num

eroZampe(), che sarà in

grado di gestire anche altri classi oltre a Cane

e Gallina

definibili in grado di gestire anche altri classi oltre a C

anee G

allina, definibili in un secondo m

omento senza necessità di apportare m

odifiche alla funzione num

eroZampe()o alle tre classi (Anim

ale, Cane e Gallina).

Page 32: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Clonare

Clonare

�In PH

P 4 durante la creazione di un oggetto attraverso la parola chiave

32

�In PH

P 4, durante la creazione di un oggetto attraverso la parola chiave new

, veniva restituito l'oggetto stesso e questo veniva mem

orizzato nella variabile specificata.

�In PH

P 5invece, quando creiam

o una nuova istanza ($oggetto =

new M

iaClasse();) new

ci restituisce non il nuovo oggetto ma un

new M

iaClasse();), new

ci restituisce non il nuovo oggetto ma un

riferimento ad esso.

Page 33: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Clonare

Clonare

�In PH

P 5se assegnate ad una variabile l'istanza di un oggetto

33

�In PH

P 5se assegnate ad una variabile listanza di un oggetto,

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.Per clonare un oggetto è sufficiente m

ettere la parola chiave clonePer clonare un oggetto è sufficiente m

ettere la parola chiave clonedopo l'operatore di assegnazione "=

".

Page 34: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Esem

pio clonazione Oggetti

<?php

34

<?phpclass O

ggetto{public $valore;public function O

ggetto($v){$this->valore

= $v;}

}$istanza1=

newO

ggetto(5);$istanza1 = new

Oggetto(5);

$istanza2 = $istanza1; // Assegnazione

per riferimento

$istanza3 = clone $istanza1; // Clonazione

oggetto$istanza2->valore

= 7; // Modifica

anche$istanza1

$istanza3->valore= 13;

echo $istanza1->valore; // Non stam

pa5 m

a 7echo

$istanza2->valore;//Stam

pa7

echo $istanza2>valore; // S

tampa

7echo $istanza3->valore; // S

tampa

13?>C

lonandoun oggetto, per definizione

sicreauna

copiaesatta

ditale oggetto, quindiiriferim

enticontenutiin essosaranno

comunque

copiaticome tali, e dopo

la clonazioneconterranno

ancorailriferim

entoalla

stessarisorsa

diprima.

Page 35: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Esem

pio clonazione Oggetti

Cld

tt

d

fii

ii

itt

35

Clonandoun oggetto, per definizione

sicreauna

copiaesatta

ditale oggetto, quindiiriferimenticontenutiin esso

sarannocom

unquecopiaticom

e tali, e dopola clonazione

comunque

copiaticome tali, e dopo

la clonazioneconterranno

ancorailriferim

entoalla

stessarisorsa

diprima.

Page 36: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Classi astratte

Classi astratte

�L

l

it

tti

ttdi

ifi

36

�Le classiastratte

cipermettono

dispecificarecon

esattezzaqualiclassie qualim

etodidevonoobbligatoriam

enteessere

ridefinitidauna

sottoclasseper

obbligatoriamente

essereridefinitida

unasottoclasse

per poteressere

utilizzati.

�La sottoclasse

derivatada

unaclasse

astratta, dovràobbligatoriam

entedefinire

talimetodiastrattiper far sìche

gp

l'ereditarietàvenga

accettata.

Page 37: ca i Veron Pasqualetti OOP...Test.php -commenti classe la Osservando php" "Persona i l g i t t u t e h c e r a t o n o m a i s s o p 9 "Persona. php", chiave parola la con dichiarati

Utilizzo classi astratte

Utilizzo classi astratte

<?php

37

<?phpabstract class A

nimale{

protected $zampe;

protected function Anim

ale($z){$this->zam

pe=

$z;

�Il m

etodoastratto

"suono()"della

classeastratta

"Anim

ale"è solam

ente$this

>zampe

$z;}public function num

eroZampe(){

echo $this->zampe;

}

"Anim

ale"è solam

entedichiarato, m

entrela

definizioneavviene

dill

l}abstract protected function suono();

}class Cane extends A

nimale{

publicfunction

Cane(){

direttamente

nellaclasse

derivata.

public function Cane(){

parent::Anim

ale(4);}public function suono(){echo

"bau!";}

�D

ichiarandoCane senza

la definizione

disuono(), tt

t

{ echo "bau!"; }}$rex

= new C

ane();$rex->num

eroZampe(); // S

tampa

4$

>()

//St

"b!”

avremm

oottenuto

un errore.

$rex->suono(); // Stam

pa"bau!”

?>