Assegnare valori alle variabili è sicuramente l’operazione più comune all’interno di uno script PHP. Ma come vengono conservate queste informazioni dall’interprete? Vediamolo assieme!
L’unità fondamentale di storage dei dati in PHP è la Zend Value (zval). Si tratta di una struct definita alla linea 334 di zend.h, la riporto qui di seguito per commentarne le proprietà.
struct _zval_struct {
zvalue_value value; /* Il valore assegnato alla variabile */
zend_uint refcount__gc; /* Il conto delle referenze legato alla variabile */
zend_uchar type; /* L'identificativo del tipo di dato */
zend_uchar is_ref__gc; /* Flag che indica se la variabile è o meno una referenza */
};
Il tipo di dato zvalue_value non è altro che una union contenente tutti i tipi di dato gestiti da php, per questo ogni variabile che instanziamo in PHP, sia essa un intero o una stringa occuperà comunque lo stesso spazio in memoria richiesto per il tipo di dato più grande.
Per mostrare come php gestisce l’allocazione delle variabili vediamo un semplice esempio:
$a = 1; // value=1, refcount=1
$b = $a; // value=1, refcount=2
$a++; // value=2, refcount = 1
$c = $b; // value=1, refcount=2
Cosa succede qui?
-
$aviene allocata con valore1, e quindi per la variabile$ail refcount viene impostato a 1. -
Il valore di
$aviene assegnato anche a$b, quindi PHP per evitare di sprecare memoria assegna la stessa zval anche a$b, aumentando di 1 il refcount. -
$aviene incrementato di1, -
Essendo il valore della zval di
$aè cambiato, php crea una nuova zval per$be$c -
Ora la zval di
$aappartiene solo ad$acon valore2e refcount1 -
$bha una nuova zval con valore1e refcount1 -
Essendo la zval di
$cè la stessa di$bla zval di$cha valore1e refcount2

Share this post
X
Facebook
Reddit
LinkedIn
StumbleUpon
Pinterest
Email