Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
PHP: O
OP
PHP: O
OP
Pa
squ
ale
ttiV
ero
nica
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.
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().
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
;}
}
?>
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
dà
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).
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.
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>
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.
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.
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)
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
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à.
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.
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";}
}?>
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";?>
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");??>
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";
}}
?>
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;
}}
?>
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();
??>
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
iù
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.
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.
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;
}}
?>
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}
}}?>
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}
}
?>
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.
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ì");
?>?>
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";
}}
?>
Utilizzare A
lanoU
tilizzare Alano
testphp
28
test.php<?php
require_once("Alano.php");
$cane = new Alano();
$cane->stampaD
ati();
?>
Polimorfism
oPolim
orfismo
29
�Il Polim
orfismo
è la capacitàdiutilizzare
un unicom
etodoin grado
dicom
portarsiin modo
specificoquando
applicatoa tipi didato
differenti.
�Q
tè
ibili
ll'
diti
tà
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).
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
?>
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).
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.
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 "=
".
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.
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.
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.
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!”
?>