Оператор присваивания

Базовый оператор присваивания обозначается как "=". На первый взгляд может показаться, что это оператор "равно". На самом деле это не так. В действительности, оператор присваивания означает, что левый операнд получает значение правого выражения, (т.е. устанавливается значением).

Результатом выполнения оператора присваивания является само присвоенное значение. Таким образом, результат выполнения "$a = 3" будет равен 3. Это позволяет делать трюки наподобие:

<?php

$a 
= ($b 4) + 5// $a теперь равно 9, а $b было присвоено 4.

?>

Для массивов (array), присвоение значения именованному ключу происходит с помощью оператора "=>". Приоритет этого оператора такой же, как и у остальных операторов присваивания.

В дополнение к базовому оператору присваивания имеются "комбинированные операторы" для всех бинарных арифметическихопераций, операций объединения массивов и строковых операций, которые позволяют использовать некоторое значение в выражении, а затем установить его как результат данного выражения. Например:

<?php

$a 
3;
$a += 5// устанавливает $a в 8, как если бы мы написали: $a = $a + 5;
$b "Hello ";
$b .= "There!"// устанавливает $b в "Hello There!",  как и $b = $b . "There!";

?>

Обратите внимание, что присвоение копирует оригинальную переменную в новую (присвоение по значению), таким образом все последующие изменения одной из переменных никак не отразятся на другой. Это также следует учитывать, если вам надо скопировать что-то типа большого массива в длинном цикле.

Исключением из обычного для PHP способа присваивания по значению явлаются объекты (object), которые, начиная с версии PHP 5, присваиваются по ссылке. Принудительно скопировать объекты по значению можно с помощью специального ключевого слова clone.

Присваивание по ссылке

Присваивание по ссылке также поддерживается, для него используется синтаксис $var = &$othervar;. 'Присваивание по ссылке' означает, что обе переменные указывают на одни и те же данные и никакого копирования не происходит.

Пример #1 Присваивание по ссылке

<?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 успело измениться
?>

Начиная с версии PHP 5, оператор new автоматически возвращает ссылку, поэтому присваивание результата операции new по ссылке начиная с версии PHP 5.3 генерирует ошибку уровня E_DEPRECATED, а в более ранних версиях - ошибку уровня E_STRICT.

Например, следующий код выдаст предупреждение:

<?php
class {}

/* Следующая строка сгенерирует следующее сообщение об ошибке:
 * Deprecated: Assigning the return value of new by reference is deprecated in...
 * (Устаревший код: Присвоение результата работы new по ссылке устарело в...)
 */
$o = &new C;
?>

Для получения более полной информации о ссылках и их возможностях обратитесь к разделу Подробно о ссылках.

Коментарии

Автор:
bradlis7 at bradlis7 dot com's description is a bit confusing. Here it is rephrased.

<?php
$a 
'a';
$b 'b';

$a .= $b .= "foo";

echo 
$a,"\n",$b;?>
outputs

abfoo
bfoo

Because the assignment operators are right-associative and evaluate to the result of the assignment
<?php
$a 
.= $b .= "foo";
?>
is equivalent to
<?php
$a 
.= ($b .= "foo");
?>
and therefore
<?php
$b 
.= "foo";
$a .= $b;
?>
2007-10-07 18:22:17
http://php5.kiev.ua/manual/ru/language.operators.assignment.html
Автор:
Using $text .= "additional text"; instead of $text =  $text ."additional text"; can seriously enhance performance due to memory allocation efficiency. 

I reduced execution time from 5 sec to .5 sec (10 times) by simply switching to the first pattern for a loop with 900 iterations over a string $text that reaches 800K by the end.
2011-02-11 03:44:54
http://php5.kiev.ua/manual/ru/language.operators.assignment.html
Автор:
Be aware of assignments with conditionals. The assignment operator is stronger as 'and', 'or' and 'xor'.

<?php 
$x 
true and false;   //$x will be true
$y = (true and false); //$y will be false
?>
2015-03-13 15:03:32
http://php5.kiev.ua/manual/ru/language.operators.assignment.html
Автор:
PHP uses a temporary variable for combined assign-operators (unlike JavaScript), therefore the left-hand-side (target) gets evaluated last.

Input:
$a += $b + $c; 

Meaning:
$a = ($b + $c) + $a;

Not:
$a = $a + ($b + $c);

This can be important if the target gets modified inside the expression.

$a = 0;
$a += (++$a) + (++$a); // yields 5 (instead of 4)
2015-07-13 17:39:29
http://php5.kiev.ua/manual/ru/language.operators.assignment.html

    Поддержать сайт на родительском проекте КГБ