[Php-it] unset() di un oggetto
Cristiano Verondini
cverondini at deis.unibo.it
Thu Jun 8 11:32:32 CEST 2006
> Scusa la petulanza ma mi interessa capire bene sta cosa.
Non scusarti, anzi, credo che questi scambi di idee possano servire a
tutti! :)
> Dunque, mettiamo che ho:
> Class A {
> ...
> function pippo() {
> $altroOggetto = new AltroOggetto();
> ...
> }
> }
>
> quindi:
> $pluto = new A();
> ...
>
> mettiamo che, ad un certo punto, faccio un uso esplicito di
> unset($pluto), succede che:
> 1) viene distrutto (e quindi deallocato) $altroOggetto e
> 2) viene distrutto l'oggetto $pluto.
> E' corretto o mi sbaglio?
Il tuo esempio non è calzante, perché $altroOggetto è una variabile
locale, e quindi non viene memorizzata nell'istanza dell'oggetto. Provo ad
interpretare quello che volevi dire:
class A {
var $mOggetto = NULL;
function A() { $this->mOggetto =& new AltroOggetto(); }
}
$pluto =& new A();
Quando viene creata l'istanza $pluto, viene creata anche un'istanza di
AltroOggetto ed un riferimento a quest'istanza viene memorizzato nella
variabile $mOggetto dell'istanza $pluto.
Se ora faccio un unset($pluto), vengono distrutte (il che equivale ad un
unset()) tutte le variabili membro dell'istanza $pluto, quindi anche
l'istanza di AltroOggetto che era stata creata viene distrutta.
Quando si distrugge un oggetto, viene chiamato il metodo __destruct(),
se esiste, *prima* della cancellazione delle variabili locali. Quindi è come
se venisse data un'ultima possibilità prima dell'eliminazioni delle
variabili membro.
> Ma mettiamo che $altroOggetto abbia aperta una sessione con un DBMS o
> altro simile, cosa succede in questo caso? Da quello che mi dici viene
> invocato il metodo __destruct() (se presente) implementato nella
> classe A o mi sbaglio?
Viene chiamato il metodo __destruct() di tutte le istanze che stai
appunto eliminando. Se l'istanza di AltroOggetto ha aperta una connessione
col DB o qualsiasi altra cosa che è necessario chiudere, quest'operazione
andrà fatta nel suo distruttore.
In pratica la sequenza delle operazioni, a fronte di un unset($pluto) è
la seguente:
(1) cancellazione di tutte le variabili membro dell'istanza $pluto
(1.a) invocazione del distruttore di mOggetto
(2) invocazione del distruttore di pluto
> Quindi, se è vero quanto sopra, devo aver implementato in tale metodo
> (__destruct()) un qualcosa che mi chiuda questo collegamento con il
> DBMS. Giusto?
Esatto.
Poi, se vogliamo, il distruttore può essere usato in modi anche pi
creativi :)
Cris
--
Cristiano Verondini
http://noway.ing.unibo.it --- [ICQ: 114 190]
More information about the Php-it
mailing list