Riferimenti degli oggetti



Una differenza molto importante presente in ogni linguaggio di programmazione è sicuramente quella che intercorre tra valore e riferimento. Come sappiamo, se si lavora con i valori si ha a che fare con vere e proprie "copie" dei dati, mentre se si stanno utilizzando i riferimenti, si ha a che fare con i dati veri e propri: eventuali modifiche influenzeranno le variabili o i dati reali.

Dalla versione 5 di PHP, gli oggetti non vengono più trattati per valore, ma per riferimento (in realtà, come spiegheremo tra qualche riga, più che riferimenti si tratta di copie dello stesso identificatore univoco). Questo, a parte tutte le migliorie interne al motore del linguaggio, implica che se si passa un oggetto ad una funzione o lo si assegna ad un'altra variabile, quello che verrà utilizzato sarà il suo riferimento e dunque l'oggetto verrà modificato. Di seguito troviamo degli esempi pratici che spiegano molto bene questo concetto. Partiamo dall'assegnazione di un oggetto con una variabile:

class MyClass {

        public $a = 10;

}

$myClass_1 = new MyClass;

// assegnazione, ora entrambe le variabili si riferiscono allo stesso id univoco
$myClass_2  = $myClass_1;

// modifica
$myClass_2->a = 20;

// aggiunta
$myClass_2->b = 30;

// stampa 20
echo $myClass_1->a;

// stampa 30
echo $myClass_1->b; 

Entrambe le variabili $myClass_1 e $myClass_2 si riferiscono alla stessa posizione, dunque eventuali modifiche o aggiunte ad una di esse si ripercuoteranno anche sull'altra. Vediamo ora il caso in cui passiamo gli oggetti come parametri delle funzioni:

class MyClass {

        public $a = 10;

}

$myClass_1 = new MyClass;

// funzione che modifica gli oggetti
function editObj($obj) {
        $obj->a = 20;
}

// chiamata
editObj($myClass_1);

// stampa 20
echo $myClass_1->a;

Anche in questo caso, ciò con cui si lavora è il riferimento e non il valore, dunque l'oggetto originale viene alterato.

Riferimento vs identificatore

Come ho dichiarato in precedenza, anche se il comportamento è pressoché identico, in realtà nel caso degli oggetti non si ha a che fare con veri e propri riferimenti, ma con copie dello stesso identificatore. Ogni variabile istanza possiede un identificatore univoco (che chiameremo id): quando si assegna l'oggetto ad una nuova variabile o lo si passa ad una funzione, questo id verrà utilizzato come riferimento:

class MyClass {
        
        // implementazione...
}

$a = new MyClass; // -id- assegnato

// ($a) = ($b) = -id-
$b = $a;

function editObj($obj) {
        // ($obj) = ($a) = -id-
        $obj->a = 20;
}

Ovviamente, anche con gli oggetti è possibile utilizzare il riferimento vero e proprio tramite l'operatore &. In questo caso verrà utilizzato il riferimento stesso: entrambe le variabili si riferiranno alla stessa posizione:

$a = new MyClass; // -id- assegnato

// ($a, $b) = -id-
$b = $a;

Conclusione

Bisogna tenere sempre in mente che in PHP5 gli oggetti vengono trattati per riferimento: questo concetto è di vitale importanza per le nostre applicazioni. Gli sviluppatori che non provengono dalla versione 4 di PHP molto probabilmente troveranno questo comportamento a dir poco naturale ed "ovvio", mentre chi è abituato a trattare gli oggetti per valore dovrà svolgere qualche piccolo test per prendere confidenza con questo nuovo (e sicuramente migliore) stile di programmazione.

Ultimi articoli PHP

Sessioni PHP: cosa sono, come si usano

Dalla configurazione di PHP, alla gestione delle sessioni in un...

Continuous Integration: automatizziamo i client con Phing

Continuous Integration: automatizziamo i client con Phing. Esempi...

Archiviazione delle applicazioni PHP con Phar

Come incorporare intere applicazioni PHP all'interno di un singolo...

I traits in PHP 5.4

Cosa sono, a cosa servono e come si unsano i traits, la novità per...

PHP 5.4: il web server integrato

Impara ad usare il web server integrato nella versione 5.4 di PHP:...

Altri articoli

Guide PHP

Guida Yii Framework

Come creare applicazioni Web in modo semplice e veloce con il...

Guida Applicazioni Facebook con PHP

Come realizzare un'applicazione per Facebook. Dalle basi della...

Guida PHP con Windows e IIS

Installare ambienti per lo sviluppo e la produzione di applicazioni...

Altre guide

Newsletter @PHP

Ogni lunedì, direttamente nella tua e-mail: script, articoli, guide e tutorial su PHP, MySQL e Apache.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso PHP per Webmaster

11 Giugno 2012 a Milano
Disponibilità: 7 Posti

Corso Google AdWords Base

25 Giugno 2012 a Milano
Disponibilità: 7 Posti

Corso Google AdWords Base

05 Giugno 2012 a Roma
Disponibilità: 7 Posti