[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