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?
-
$a
viene allocata con valore1
, e quindi per la variabile$a
il refcount viene impostato a 1. -
Il valore di
$a
viene assegnato anche a$b
, quindi PHP per evitare di sprecare memoria assegna la stessa zval anche a$b
, aumentando di 1 il refcount. -
$a
viene incrementato di1
, -
Essendo il valore della zval di
$a
è cambiato, php crea una nuova zval per$b
e$c
-
Ora la zval di
$a
appartiene solo ad$a
con valore2
e refcount1
-
$b
ha una nuova zval con valore1
e refcount1
-
Essendo la zval di
$c
è la stessa di$b
la zval di$c
ha valore1
e refcount2
Share this post
X
Facebook
Reddit
LinkedIn
StumbleUpon
Pinterest
Email