PHP Conference Japan 2024

指定運算子

基本的指定運算子是「=」。您一開始可能會認為這是「等於」。不要這樣想。它的真正含義是將左運算元設定為右運算式的值(也就是「設定為」)。

指定運算式的值是被指定的值。也就是說,「$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 中通常按值賦值的行為有一個例外,那就是物件,它們是按引用賦值的。物件可以通過 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 已經被修改了
?>

new 運算子會自動返回一個引用,因此按引用賦值 new 的結果是一個錯誤。

<?php
class C {}

$o = &new C;
?>

以上範例會輸出:

Parse error: syntax error, unexpected 'new' (T_NEW) in …

更多關於引用的資訊及其潛在用途,請參閱手冊的「引用說明」章節。

算術賦值運算子

範例 等效於 運算
$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 位元 AND
$a |= $b $a = $a | $b 位元 OR
$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 空值合併運算子
新增註釋

使用者貢獻的註釋 4 則註釋

Peter, Moscow(莫斯科)
13 年前
使用 $text .= "additional text"; 取代 $text = $text . "additional text"; 可以因為記憶體配置效率的關係,大幅提升效能。

我透過簡單地將一個迴圈(對一個最終大小達到 800K 的字串 $text 進行 900 次迭代)切換到第一種模式,將執行時間從 5 秒減少到 0.5 秒(快了 10 倍)。
Robert Schneider
9 年前
要注意帶有條件式的賦值。賦值運算子的優先順序高於 'and'、'or' 和 'xor'。

<?php
$x
= true and false; //$x 的值會是 true
$y = (true and false); //$y 的值會是 false
?>
Hayley Watson
17 年前
bradlis7 at bradlis7 dot com 的描述有點令人困惑。這裡重新改寫一下。

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

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

echo
$a,"\n",$b;?>
會輸出

abfoo
bfoo

因為賦值運算子是右結合性,並且會計算賦值的結果
<?php
$a
.= $b .= "foo";
?>
等同於
<?php
$a
.= ($b .= "foo");
?>
因此
<?php
$b
.= "foo";
$a .= $b;
?>
asc at putc dot de
9 年前
PHP 與 JavaScript 不同,在組合賦值運算子時會使用一個暫存變數,因此左邊(目標)會最後被求值。

輸入
$a += $b + $c;

意義
$a = ($b + $c) + $a;

而非
$a = $a + ($b + $c);

如果目標在表達式內被修改,這點就變得相當重要。

$a = 0;
$a += (++$a) + (++$a); // 結果為 5 (而不是 4)
To Top