Базовый оператор присваивания обозначается как «=». На первый взгляд может показаться, что это оператор «равно». На самом деле это не так. В действительности, оператор присваивания означает, что левый операнд получает значение правого выражения, (т.е. устанавливается значением).
Результатом выполнения оператора присваивания является само присвоенное значение. Таким образом, результат выполнения «$a = 3» будет равен 3. Это позволяет делать трюки наподобие:
<?php $a = ($b = 4) + 5; // $a теперь равно 9, а $b было присвоено 4. ?>
В дополнение к базовому оператору присваивания имеются «комбинированные операторы» для всех бинарных арифметическихопераций, операций объединения массивов и строковых операций, которые позволяют использовать некоторое значение в выражении, а затем установить его как результат данного выражения. Например:
<?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 C {} /* Следующая строка сгенерирует следующее сообщение об ошибке: * Deprecated: Assigning the return value of new by reference is deprecated in... * (Устаревший код: Присвоение результата работы new по ссылке устарело в...) */ $o = &new C; ?>
Для получения более полной информации о ссылках и их возможностях обратитесь к разделу Подробно о ссылках.