-
Notifications
You must be signed in to change notification settings - Fork 79
/
Copy pathdebug-zval-dump.xml
186 lines (184 loc) · 6.64 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
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 2a5223230bf6177c225003ca30c63f48ef266cc0 Maintainer: shimooka Status: ready -->
<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>内部的な zval を表す文字列をダンプする</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>void</type><methodname>debug_zval_dump</methodname>
<methodparam><type>mixed</type><parameter>value</parameter></methodparam>
<methodparam rep="repeat"><type>mixed</type><parameter>values</parameter></methodparam>
</methodsynopsis>
<para>
内部的な zval (Zend の値) を表す文字列表現をダンプします。
これは Zend Engine や PHP 拡張モジュールの実装の詳細をデバッグしたり、理解したりするのに役立ちます。
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>value</parameter></term>
<listitem>
<para>
ダンプする変数または値。
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>values</parameter></term>
<listitem>
<para>
ダンプする追加の変数または値。
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
&return.void;
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title><function>debug_zval_dump</function> の例</title>
<programlisting role="php">
<![CDATA[
<?php
$var1 = 'Hello';
$var1 .= ' World';
$var2 = $var1;
debug_zval_dump($var1);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
string(11) "Hello World" refcount(3)
]]>
</screen>
</example>
</para>
<note>
<title><literal>refcount</literal> を理解する</title>
<para>
Zend Engine の実装の詳細を理解していないと、
この関数が表示する <literal>refcount</literal> の値に驚くかもしれません。
</para>
<para>
Zend Engine は、リファレンスカウントを以下の2つの用途で使います:
</para>
<para>
<simplelist>
<member>
"コピーオンライト" と呼ばれるテクニックを使ってメモリを最適化し、
値が同じ複数の値を保持する複数の変数を、メモリ上の同じコピーを指すようにします。
この場合、変数の値が変更された時に、
その変数は新しいメモリ上のコピーの値を指すようになります。
そして、その変数のリファレンスカウントは1になります。
</member>
<member>
リファレンス渡しされたり、リファレンスが代入されている値(
<link linkend="language.references">リファレンスの説明</link> も参照ください)
を追跡する用途にも使います。
この用途のリファレンスカウントは、
現在の値を指しているものとは別の、リファレンス用の zval に保存されています。
この追加の zval は、現状
<function>debug_zval_dump</function> では見えません。
</member>
</simplelist>
</para>
<para>
<function>debug_zval_dump</function> は、値渡しされた通常の引数を入力として受け取るので、
コピーオンライトのテクニックを使います: つまり、データをコピーせず、
関数呼び出しが行われている間、リファレンスカウントをひとつ増やします。
関数が受け取った引数を変更すると、データのコピーが行われます。
コピーを行わないと、呼び出しスコープの中でリファレンスカウントがひとつ増えてしまうからです。
</para>
<para>
渡す引数によっては、<function>debug_zval_dump</function>
はリファレンスが割り当てられている変数を表示しません。
この動きを示すために、上の例をちょっと変更した例を考えてみましょう:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$var1 = 'Hello';
$var1 .= ' World';
// Point three variables as references to the same value
$var2 =& $var1;
$var3 =& $var1;
debug_zval_dump($var1);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
string(11) "Hello World" refcount(2)
]]>
</screen>
</informalexample>
</para>
<para>
<varname>$var1</varname>, <varname>$var2</varname>,
<varname>$var3</varname> はリファレンスで結びついていますが、
<emphasis>値</emphasis> だけが <function>debug_zval_dump</function> に渡されます。
この値は、リファレンスの設定に一度使われ、
<function>debug_zval_dump</function> の中で一度使われます。
よって、リファレンスカウントは2になります。
</para>
<para>
データ型によっては、Zend Engine 内で最適化が行われてしまうため、
ユーザはさらに混乱してしまいます。
整数のように "コピーオンライト" を行わないデータ型の変数では、
リファレンスカウントを全く表示しません。
別の場合、このリファレンスカウントの値は、
内部的に使われる追加のコピーの値を表示する場合もあります。
たとえば、文字列リテラルや配列が、命令セットの一部として保存されているような場合です。
</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">リファレンスの説明</link></member>
<member><link xlink:href="&url.derick.references;">References Explained (by 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
-->