ÿ��php��������һ����"zval"�ı��������С�һ��zval�������������˰������������ͺ�ֵ�������������ֽڵĶ�����Ϣ����һ����"is_ref"���Ǹ�boolֵ��������ʶ��������Ƿ����������ü���(reference set)��ͨ������ֽڣ�php������ܰ���ͨ���������ñ������ֿ���������php�����û�ͨ��ʹ��&��ʹ���Զ������ã�zval���������л���һ���ڲ����ü������ƣ����Ż��ڴ�ʹ�á��ڶ��������ֽ���"refcount"�����Ա�ʾָ�����zval���������ı���(Ҳ�Ʒ��ż�symbol)���������еķ��Ŵ���һ�����ű��У�����ÿ�����Ŷ���������(scope)����Щ���ű�(���磺ͨ�����������ĵĽű�)��ÿ���������߷���Ҳ����������
��һ��������������ֵʱ���ͻ�����һ��zval����������������������
Example #1 ����һ���µ�zval����
<?php
$a = "new string";
?>
�������У��µı���a�����ڵ�ǰ�����������ɵġ���������������Ϊ string ��ֵΪnew string�ı����������ڶ���������ֽ���Ϣ�У�"is_ref"��Ĭ������Ϊ FALSE
����Ϊû���κ��Զ�����������ɡ�"refcount" ���趨Ϊ 1����Ϊ����ֻ��һ������ʹ�������������. ע���"refcount"��ֵ��1ʱ��"is_ref"��ֵ����FALSE
. ������Ѿ���װ��» Xdebug������ͨ�����ú��� xdebug_debug_zval()��ʾ"refcount"��"is_ref"��ֵ��
Example #2 ��ʾzval��Ϣ
<?php
xdebug_debug_zval('a');
?>
�������̻������
a: (refcount=1, is_ref=0)='new string'
��һ��������ֵ����һ�������������ô���(refcount).
Example #3 ����һ��zval�����ü���
<?php
$a = "new string";
$b = $a;
xdebug_debug_zval( 'a' );
?>
�������̻������
a: (refcount=2, is_ref=0)='new string'
��ʱ�����ô�����2����Ϊͬһ���������������� a �ͱ��� b����.��û��Ҫʱ��php����ȥ���������ɵı�������������������"refcount"���0ʱ�ͱ�����. ���κι�����ij�����������ı����뿪����������(���磺����ִ�н���)�����߶Ա��������˺��� unset()ʱ��"refcount"�ͻ��1����������Ӿ���˵��:
Example #4 �������ü���
<?php
$a = "new string";
$c = $b = $a;
xdebug_debug_zval( 'a' );
unset( $b, $c );
xdebug_debug_zval( 'a' );
?>
�������̻������
a: (refcount=3, is_ref=0)='new string' a: (refcount=1, is_ref=0)='new string'
�����������ִ�� unset($a);���������ͺ�ֵ��������������ͻ���ڴ���ɾ����
�������� array��object�����ĸ�������ʱ����������е㸴��. �� ����(scalar)���͵�ֵ��ͬ��array�� object���͵ı��������ǵij�Ա�����Դ����Լ��ķ��ű��С�����ζ����������ӽ���������zval����������
Example #5 Creating a array zval
<?php
$a = array( 'meaning' => 'life', 'number' => 42 );
xdebug_debug_zval( 'a' );
?>
�������̵���������ڣ�
a: (refcount=1, is_ref=0)=array ( 'meaning' => (refcount=1, is_ref=0)='life', 'number' => (refcount=1, is_ref=0)=42 )
ͼʾ:
������zval����������: a��meaning�� number�����Ӻͼ���"refcount"�Ĺ���������ᵽ��һ��. ����, �����������������һ��Ԫ��,���Ұ�����ֵ��Ϊ�������Ѵ���Ԫ�ص�ֵ:
Example #6 ���һ���Ѿ����ڵ�Ԫ�ص�������
<?php
$a = array( 'meaning' => 'life', 'number' => 42 );
$a['life'] = $a['meaning'];
xdebug_debug_zval( 'a' );
?>
�������̵���������ڣ�
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' )
ͼʾ��
�����ϵ�xdebug�����Ϣ�����ǿ���ԭ�е�����Ԫ�غ�����ӵ�����Ԫ�ع�����ͬһ��"refcount"2��zval��������. ���� Xdebug�������ʾ����ֵΪ'life'�� zval ������������ʵ��ͬһ���� ����xdebug_debug_zval()����ʾ�����Ϣ����������ͨ����ʾ�ڴ�ָ����Ϣ��������
ɾ�������е�һ��Ԫ�أ����������ڴ���������ɾ��һ������. ɾ����,�����е����Ԫ�����ڵ�������"refcount"ֵ���٣�ͬ������"refcount"Ϊ0ʱ��������������ʹ��ڴ��б�ɾ����������һ�����ӿ���˵����
Example #7 ��������ɾ��һ��Ԫ��
<?php
$a = array( 'meaning' => 'life', 'number' => 42 );
$a['life'] = $a['meaning'];
unset( $a['meaning'], $a['number'] );
xdebug_debug_zval( 'a' );
?>
�������̵���������ڣ�
a: (refcount=1, is_ref=0)=array ( 'life' => (refcount=1, is_ref=0)='life' )
���ڣ����������һ�����鱾����Ϊ��������Ԫ��ʱ������ͱ����Ȥ���¸����ӽ�˵��������������Ǽ��������ò�����������php������һ�����ơ�
Example #8 ��������Ϊһ��Ԫ����ӵ��Լ�
<?php
$a = array( 'one' );
$a[] =& $a;
xdebug_debug_zval( 'a' );
?>
�������̵���������ڣ�
a: (refcount=2, is_ref=1)=array ( 0 => (refcount=1, is_ref=0)='one', 1 => (refcount=2, is_ref=1)=... )
ͼʾ��
�ܿ���������� (a) ͬʱҲ���������ĵڶ���Ԫ��(1) ָ��ı���������"refcount"Ϊ 2��������������е�"..."˵�������˵ݹ����, ��Ȼ�������������ζ��"..."ָ��ԭʼ���顣
���ո�һ������һ����������unset����ɾ��������ţ�����ָ��ı��������е����ô���Ҳ��1�����ԣ����������ִ��������Ĵ���Ա���$a����unset, ��ô���� $a ������Ԫ�� "1" ��ָ��ı������������ô�����1, ��"2"���"1". ��������˵��:
Example #9 Unsetting $a
(refcount=1, is_ref=1)=array ( 0 => (refcount=1, is_ref=0)='one', 1 => (refcount=1, is_ref=1)=... )
ͼʾ��
���ܲ�����ij���������е��κη���ָ������ṹ(���DZ�������)����������Ԫ��"1"��Ȼָ�����鱾����������������ܱ���� ����Ϊû������ķ���ָ�������û�û�а취�������ṹ������ͻᵼ���ڴ�й©�����ҵ��ǣ�php���ڽű�ִ�н���ʱ���������ݽṹ��������php���֮ǰ�����ķѲ����ڴ档�����Ҫʵ�ַ����㷨������Ҫ��������һ����Ԫ��ָ�����ĸ�Ԫ�����������飬��������ͻᾭ����������Ȼ��ͬ�������Ҳ�ᷢ���ڶ����ϣ�ʵ���϶�����п��ܳ��������������Ϊ����������ʽ�ı����á�
�������������������һ���ε�ûʲô������������ּ�ǧ�Σ�������ʮ��ε��ڴ�й©������Ȼ�Ǹ������⡣�������������������ڳ�ʱ�����еĽű��У�������������ϲ���������ػ�����(deamons)���ߵ�Ԫ�����еĴ����(sets)�С����ߵ����ӣ��ڸ����eZ(һ��֪����PHP Library) ������ģ���������Ԫ����ʱ���Ϳ��ܻ�������⡣��ʱ���Կ�����Ҫ����2GB���ڴ棬�����Է������ܿ���û����ô����ڴ档