1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-26 16:52:12 +01:00
Files
archived-doc-ru/language/operators/assignment.xml

266 lines
9.3 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 43d07782b514d0c7a8487f2c74063739f302df8d Maintainer: sergey Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.operators.assignment">
<title>Операторы присваивания</title>
<titleabbrev>Присваивание</titleabbrev>
<simpara>
Базовый оператор присваивания обозначается символом «=». Кажется,
что это оператор «равно». Это не так.
Оператор присваивания означает, что левый операнд
получает значение правого выражения (то есть левому операнду «будет присвоено значение»).
</simpara>
<para>
Результатом выполнения оператора присваивания будет само присвоенное значение.
То есть, результат выполнения выражения «<literal>$a = 3</literal>» будет равен 3.
Это разрешает делать трюки наподобие:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$a = ($b = 4) + 5; // Значение переменной $a равно 9, а переменной $b присвоено значение 4.
?>
]]>
</programlisting>
</informalexample>
</para>
<para>
В дополнение к базовому оператору присваивания существуют «комбинированные операторы»
для всех <link linkend="language.operators">бинарных арифметических</link> операций,
операций объединения массивов и строковых операций, которые дают
присвоить значение в выражении, а затем установить его значение
в результат этого выражения. Например:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$a = 3;
$a += 5; // устанавливает для переменной $a значение 8, как если бы было написано: $a = $a + 5;
$b = "Привет";
$b .= "-привет!"; // устанавливает переменной $b значение «Привет-привет!», как и $b = $b . "-привет!";
]]>
</programlisting>
</informalexample>
</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 = &amp;$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>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
class C {}
$o = &new C;
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Parse error: syntax error, unexpected 'new' (T_NEW) in …
]]>
</screen>
</informalexample>
</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 &amp;= $b</entry>
<entry>$a = $a &amp; $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 &lt;&lt;= $b</entry>
<entry>$a = $a &lt;&lt; $b</entry>
<entry>Побитовый сдвиг влево</entry>
</row>
<row>
<entry>$a &gt;&gt;= $b</entry>
<entry>$a = $a &gt;&gt; $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
-->