O Garbage Collection é um contender onde ficam alocadas variáveis com seus respectivos tipos e valores, também armazenam bits condicionais, esses bits condicionais com valores default de 0 e 1 chamados de ‘is_ref’ e ‘refcount’ respectivamente.
Is_ref:
É a quantidade de referências na memória, possue o número default representado por 0, a cada referência na memória é acrescentado +1 a esse valor, ou seja, se referenciarmos uma variavel o valor de is_ref torna-se 1, se referenciarmos outra variavel o valor de is_ref torna-se 2.
refcount:
É a quantidade de variáveis no programa, possue o número default representado por 1, a cada variável criada é somado +1 na contagem de ‘refcount’, assim, se criarmos 2 variáveis teremos refcount igual a 2, e assim por diante.
Na Prática:
<?php
$a = 'string';
xdebug_debug_zval('a');
?>
irá imprimir:
a: (refcount=1, is_ref=0)='string'
<?php $a = "new string"; $b = $a; xdebug_debug_zval( 'a' ); ?>
Irá imprimir:
a: (refcount=2, is_ref=0)='string'
<?php $a = "string"; $c = $b = $a; xdebug_debug_zval( 'a' ); unset( $b, $c ); xdebug_debug_zval( 'a' ); ?>
irá imprimir:
a: (refcount=3, is_ref=0)='string' a: (refcount=1, is_ref=0)='string'
<?php $a = array( 'meaning' => 'life', 'number' => 42 ); xdebug_debug_zval( 'a' ); ?>
irá imprimir:
a: (refcount=1, is_ref=0)=array ( 'meaning' => (refcount=1, is_ref=0)='life', 'number' => (refcount=1, is_ref=0)=42 )
<?php $a = array( 'meaning' => 'life', 'number' => 42 ); $a['life'] = $a['meaning']; xdebug_debug_zval( 'a' ); ?>
irá imprimir:
a: (refcount=1, is_ref=0)=array ( 'meaning' => (refcount=2, is_ref=0)='life', 'number' => (refcount=1, is_ref=0)=42, 'life' => (refcount=2, is_ref=0)='life' )
<?php $a = 'string'; $b =&$a; xdebug_debug_zval( 'a' ); ?>
irá imprimir:
a: (refcount=2, is_ref=1)='string'
OBS: estou usando o xdebug para debugar, caso utilize o comando xdebug_debug_zval( ); e não funcione, certifique-se de instalar o xdebug, ou verifique se sua IDE possui xdebug.
Para instalar visite o site oficial: site oficial xdebug