-
Notifications
You must be signed in to change notification settings - Fork 58
/
Copy pathdebug-zval-dump.xml
187 lines (181 loc) · 5.48 KB
/
debug-zval-dump.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: f0d05b38c3dd79b8a2368ec4ec03716c24766d90 Maintainer: jesusruiz Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="function.debug-zval-dump" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>debug_zval_dump</refname>
<refpurpose>Vuelca a la salida una cadena con la representación de un valor interno de zend</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>void</type><methodname>debug_zval_dump</methodname>
<methodparam><type>mixed</type><parameter>variable</parameter></methodparam>
<methodparam choice="opt"><type>mixed</type><parameter>...</parameter></methodparam>
</methodsynopsis>
<para>
Volcar a la salida una cadena con la representación de un valor interno de zend.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>variable</parameter></term>
<listitem>
<para>
La variable a ser evaluada
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
&return.void;
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Ejemplo <function>debug_zval_dump</function></title>
<programlisting role="php">
<![CDATA[
<?php
$var1 = 'Hola Mundo';
$var2 = '';
$var2 =& $var1;
debug_zval_dump(&$var1);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
&string(11) "Hola Mundo" refcount(3)
]]>
</screen>
</example>
</para>
<note>
<title>Cuidado con <literal>refcount</literal></title>
<para>
El valor <literal>refcount</literal> devuelto por esta función no es
evidente en determinadas circunstancias. Por ejemplo, un desarrollador puede
esperar que el ejemplo anterior indique un <literal>refcount</literal> de
<literal>2</literal>. La tercera referencia se crea cuando se realiza la
llamada a <function>debug_zval_dump</function>.
</para>
<para>
Este comportamiento se agrava aún más cuando una variable no se pasa a
<function>debug_zval_dump</function> por referencia. Para ilustrar esto, considere
una versión ligeramente modificada del ejemplo anterior:
</para>
<para>
<example>
<title/>
<programlisting role="php">
<![CDATA[
<?php
$var1 = 'Hola Mundo';
$var2 = '';
$var2 =& $var1;
debug_zval_dump($var1); // esta vez, no pasada por referencia
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
string(11) "Hola Mundo" refcount(1)
]]>
</screen>
</example>
</para>
<para>
Por qué <literal>refcount(1)</literal>? Porque una copia de <literal>$var1</literal> es
realizada, cuando se llama a la función.
</para>
<para>
Esta función se hace aún <emphasis>más</emphasis> confusa cuando una
variable con un <literal>refcount</literal> de <literal>1</literal> es
pasada (por copia/valor):
</para>
<para>
<example>
<title/>
<programlisting role="php">
<![CDATA[
<?php
$var1 = 'Hola Mundo';
debug_zval_dump($var1);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
string(11) "Hola Mundo" refcount(2)
]]>
</screen>
</example>
</para>
<para>
Un <literal>refcount</literal> de <literal>2</literal>, aquí, no es extremedamente
evidente. Especialmente teniendo en cuenta los ejemplos anteriores. ¿Qué ha ocurrido?
</para>
<para>
Cuando una variable tiene una sola referencia (como ocurría con <literal>$var1</literal>
antes de que fuera utilizada como un argumento para <function>debug_zval_dump</function>),
el motor de PHP optimiza la manera en que se pasa a una función.
Internamente, PHP trata <literal>$var1</literal> como una referencia (en esa
<literal>refcount</literal> se incrementa para el ámbito de esa
función), con la salvedad de que <emphasis>si</emphasis> la referencia pasa a ser
aprobada por escrito y, una copia es realizada, pero sólo en el momento de
la escritura. Esto se conoce como "copiar al escribir."
</para>
<para>
Así que, si <function>debug_zval_dump</function> pasa a escribir en su único
parámetro (y no lo hace), es entonces cuando se haría una copia. Hasta entonces, el
parámetro sigue siendo una referencia, haciendo que <literal>refcount</literal> sea
incrementado a <literal>2</literal> en el ámbito de la función llamada.
</para>
</note>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>var_dump</function></member>
<member><function>debug_backtrace</function></member>
<member><link linkend="language.references">Explicación de las Referencias</link></member>
<member><link xlink:href="&url.derick.references;">Explicación de las Referencias (por Derick Rethans)</link></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->