ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ присваивания

Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания обозначаСтся символом Β«=Β». ΠšΠ°ΠΆΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ это ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Β«Ρ€Π°Π²Π½ΠΎΒ». Π­Ρ‚ΠΎ Π½Π΅ Ρ‚Π°ΠΊ. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π»Π΅Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ выраТСния (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π»Π΅Π²ΠΎΠΌΡƒ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρƒ Β«Π±ΡƒΠ΄Π΅Ρ‚ присвоСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β»).

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присваивания Π±ΡƒΠ΄Π΅Ρ‚ само присвоСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ΠΎ Π΅ΡΡ‚ΡŒ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния выраТСния Β«$a = 3Β» Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ 3. Π­Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Ρ€ΡŽΠΊΠΈ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 Π’Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ присваиваниС

<?php

$a
= ($b = 4) + 5; // Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $a Ρ€Π°Π²Π½ΠΎ 9, Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $b ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΠ»ΠΎΡΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 4
var_dump($a);

?>

Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ Π±Π°Π·ΠΎΠ²ΠΎΠΌΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ присваивания ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Β«ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹Β» для всСх Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ объСдинСния массивов ΠΈ строковых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π°ΡŽΡ‚ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ этого выраТСния. НапримСр:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #2 БоставноС присваиваниС

<?php

$a
= 3;
$a += 5; // УстанавливаСт для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $a Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 8, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ написали: $a = $a + 5;
$b = "ΠŸΡ€ΠΈΠ²Π΅Ρ‚";
$b .= "-ΠΏΡ€ΠΈΠ²Π΅Ρ‚!"; // УстанавливаСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $b Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ "ΠŸΡ€ΠΈΠ²Π΅Ρ‚-ΠΏΡ€ΠΈΠ²Π΅Ρ‚!", ΠΊΠ°ΠΊ ΠΈ присваиваниС $b = $b . "-ΠΏΡ€ΠΈΠ²Π΅Ρ‚!";

var_dump($a, $b);

?>

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ присвоСниС ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π² Π½ΠΎΠ²ΡƒΡŽ (присвоСниС ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ), поэтому ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ измСнСния ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ отразятся Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ умСстным ΠΏΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ большого массива Π² Π΄Π»ΠΈΠ½Π½ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅.

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ для PHP способа присваивания ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ (object), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ссылкС. ΠŸΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово clone.

ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ ссылкС

ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ ссылкС Ρ‚ΠΎΠΆΠ΅ поддСрТиваСтся, для этого ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ синтаксис $var = &$othervar;. ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ ссылкС ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½ΠΈΠΊΡƒΠ΄Π° Π½Π΅ копируСтся.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #3 Assigning by reference

<?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 успСло ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ

?>

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new автоматичСски Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ссылку, поэтому присваиваниС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ new ΠΏΠΎ ссылкС Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #4 ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new ΠΏΠΎ ссылкС

<?php

class C {}

$o = &new C();

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

Parse error: syntax error, unexpected token ";", expecting "("

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ ссылках рассказываСт Ρ€Π°Π·Π΄Π΅Π» «ОбъяснСниС ссылок».

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ арифмСтичСского присваивания

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π­ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚ ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ
$a += $b $a = $a + $b Π‘Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅
$a -= $b $a = $a - $b Π’Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅
$a *= $b $a = $a * $b Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅
$a /= $b $a = $a / $b Π”Π΅Π»Π΅Π½ΠΈΠ΅
$a %= $b $a = $a % $b ΠœΠΎΠ΄ΡƒΠ»ΡŒ
$a **= $b $a = $a ** $b Π’ΠΎΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ присваивания

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π­ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚ ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ
$a &= $b $a = $a & $b ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ И
$a |= $b $a = $a | $b ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ Π˜Π›Π˜
$a ^= $b $a = $a ^ $b ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ Π˜Π›Π˜ (Xor)
$a <<= $b $a = $a << $b ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг Π²Π»Π΅Π²ΠΎ
$a >>= $b $a = $a >> $b ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг Π²ΠΏΡ€Π°Π²ΠΎ

Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ присваивания

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π­ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚ ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ
$a .= $b $a = $a . $b ΠšΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΡ строк
$a ??= $b $a = $a ?? $b ОбъСдинСниС с Null
οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 4 notes

up
146
Peter, Moscow ΒΆ
15 years ago
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.
up
59
Robert Schneider ΒΆ
11 years ago
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
?>
up
31
Hayley Watson ΒΆ
18 years ago
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;
?>
up
17
asc at putc dot de ΒΆ
10 years ago
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)