-
Notifications
You must be signed in to change notification settings - Fork 76
/
Copy pathassignment.xml
274 lines (261 loc) · 9.47 KB
/
assignment.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
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 16934048f79c6e117cd16a23c09c1b2ea502e284 Maintainer: sergey Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.operators.assignment">
<title>Операторы присваивания</title>
<titleabbrev>Присваивание</titleabbrev>
<simpara>
Базовый оператор присваивания обозначается символом «=». Кажется,
что это оператор «равно». Это не так.
Оператор присваивания означает, что левый операнд
получает значение правого выражения (то есть левому операнду «будет присвоено значение»).
</simpara>
<para>
Результатом выполнения оператора присваивания будет само присвоенное значение.
То есть, результат выполнения выражения «<literal>$a = 3</literal>» будет равен 3.
Это разрешает делать трюки наподобие:
<example>
<title>Вложенное присваивание</title>
<programlisting role="php">
<![CDATA[
<?php
$a = ($b = 4) + 5; // Значение переменной $a равно 9, а переменной $b присвоилось значение 4
var_dump($a);
?>
]]>
</programlisting>
</example>
</para>
<para>
В дополнение к базовому оператору присваивания существуют «комбинированные операторы»
для всех <link linkend="language.operators">бинарных арифметических</link> операций,
операций объединения массивов и строковых операций, которые дают
присвоить значение в выражении, а затем установить его значение
в результат этого выражения. Например:
<example>
<title>Составное присваивание</title>
<programlisting role="php">
<![CDATA[
<?php
$a = 3;
$a += 5; // Устанавливает для переменной $a значение 8, как если бы написали: $a = $a + 5;
$b = "Привет";
$b .= "-привет!"; // Устанавливает переменной $b значение "Привет-привет!", как и присваивание $b = $b . "-привет!";
var_dump($a, $b);
?>
]]>
</programlisting>
</example>
</para>
<para>
Обратите внимание, что присвоение копирует оригинальную переменную в новую
(присвоение по значению), поэтому следующие изменения
одной из переменных никак не отразятся на другой. Это также может быть уместным
при копировании чего-то вроде большого массива в длинном цикле.
</para>
<para>
Исключение из обычного для PHP способа присваивания по значению — объекты
(<type>object</type>), которые присваиваются по ссылке.
Принудительно скопировать объекты по значению можно
через ключевое слово <link linkend="language.oop5.cloning">clone</link>.
</para>
<sect2 xml:id="language.operators.assignment.reference">
<title>Присваивание по ссылке</title>
<para>
Присваивание по ссылке тоже поддерживается, для этого можно использовать синтаксис
<computeroutput>$var = &$othervar;</computeroutput>.
Присваивание по ссылке означает, что обе переменные указывают
на одни и те же данные и ничего никуда не копируется.
</para>
<para>
<example>
<title>Assigning by reference</title>
<programlisting role="php">
<![CDATA[
<?php
$a = 3;
$b = &$a; // $b — это ссылка на переменную $a
print "$a\n"; // печатает 3
print "$b\n"; // печатает 3
$a = 4; // меняем переменную $a
print "$a\n"; // печатает 4
print "$b\n"; // также печатает 4, так как переменная $b — это ссылка на переменную $a,
// а значение переменной $a успело измениться
?>
]]>
</programlisting>
</example>
</para>
<para>
Оператор <link linkend="language.oop5.basic.new">new</link>
автоматически возвращает ссылку, поэтому присваивание результата операции
<link linkend="language.oop5.basic.new">new</link> по ссылке вызывает ошибку.
</para>
<para>
<example>
<title>Оператор new по ссылке</title>
<programlisting role="php">
<![CDATA[
<?php
class C {}
$o = &new C();
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Parse error: syntax error, unexpected token ";", expecting "("
]]>
</screen>
</example>
</para>
<para>
Подробнее о ссылках рассказывает
раздел «<link linkend="language.references">Объяснение ссылок</link>».
</para>
</sect2>
<sect2 xml:id="language.operators.assignment.arithmetic">
<title>Операторы арифметического присваивания</title>
<informaltable>
<tgroup cols="3">
<thead>
<row>
<entry>Пример</entry>
<entry>Эквивалент</entry>
<entry>Операция</entry>
</row>
</thead>
<tbody>
<row>
<entry>$a += $b</entry>
<entry>$a = $a + $b</entry>
<entry>Сложение</entry>
</row>
<row>
<entry>$a -= $b</entry>
<entry>$a = $a - $b</entry>
<entry>Вычитание</entry>
</row>
<row>
<entry>$a *= $b</entry>
<entry>$a = $a * $b</entry>
<entry>Умножение</entry>
</row>
<row>
<entry>$a /= $b</entry>
<entry>$a = $a / $b</entry>
<entry>Деление</entry>
</row>
<row>
<entry>$a %= $b</entry>
<entry>$a = $a % $b</entry>
<entry>Модуль</entry>
</row>
<row>
<entry>$a **= $b</entry>
<entry>$a = $a ** $b</entry>
<entry>Возведение в степень</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</sect2>
<sect2 xml:id="language.operators.assignment.bitwise">
<title>Операторы побитового присваивания</title>
<informaltable>
<tgroup cols="3">
<thead>
<row>
<entry>Пример</entry>
<entry>Эквивалент</entry>
<entry>Операция</entry>
</row>
</thead>
<tbody>
<row>
<entry>$a &= $b</entry>
<entry>$a = $a & $b</entry>
<entry>Побитовое И</entry>
</row>
<row>
<entry>$a |= $b</entry>
<entry>$a = $a | $b</entry>
<entry>Побитовое ИЛИ</entry>
</row>
<row>
<entry>$a ^= $b</entry>
<entry>$a = $a ^ $b</entry>
<entry>Побитовое исключающее ИЛИ (Xor)</entry>
</row>
<row>
<entry>$a <<= $b</entry>
<entry>$a = $a << $b</entry>
<entry>Побитовый сдвиг влево</entry>
</row>
<row>
<entry>$a >>= $b</entry>
<entry>$a = $a >> $b</entry>
<entry>Побитовый сдвиг вправо</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</sect2>
<sect2 xml:id="language.operators.assignment.other">
<title>Другие операторы присваивания</title>
<informaltable>
<tgroup cols="3">
<thead>
<row>
<entry>Пример</entry>
<entry>Эквивалент</entry>
<entry>Операция</entry>
</row>
</thead>
<tbody>
<row>
<entry>$a .= $b</entry>
<entry>$a = $a . $b</entry>
<entry>Конкатенация строк</entry>
</row>
<row>
<entry>$a ??= $b</entry>
<entry>$a = $a ?? $b</entry>
<entry>Объединение с Null</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</sect2>
<sect2 role="seealso" xml:id="language.operators.assignment.see-also">
&reftitle.seealso;
<para>
<simplelist>
<member><link linkend="language.operators.arithmetic">Арифметические операторы</link></member>
<member><link linkend="language.operators.bitwise">Побитовые операторы</link></member>
<member><link linkend="language.operators.comparison.coalesce">Операторы объединения с null</link></member>
</simplelist>
</para>
</sect2>
</sect1>
<!-- 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
-->