使用 $text .= "additional text"; 取代 $text = $text . "additional text"; 可以因為記憶體配置效率的關係,大幅提升效能。
我透過簡單地將一個迴圈(對一個最終大小達到 800K 的字串 $text 進行 900 次迭代)切換到第一種模式,將執行時間從 5 秒減少到 0.5 秒(快了 10 倍)。
基本的指定運算子是「=」。您一開始可能會認為這是「等於」。不要這樣想。它的真正含義是將左運算元設定為右運算式的值(也就是「設定為」)。
指定運算式的值是被指定的值。也就是說,「$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 | 空值合併運算子 |
使用 $text .= "additional text"; 取代 $text = $text . "additional text"; 可以因為記憶體配置效率的關係,大幅提升效能。
我透過簡單地將一個迴圈(對一個最終大小達到 800K 的字串 $text 進行 900 次迭代)切換到第一種模式,將執行時間從 5 秒減少到 0.5 秒(快了 10 倍)。
要注意帶有條件式的賦值。賦值運算子的優先順序高於 'and'、'or' 和 'xor'。
<?php
$x = true and false; //$x 的值會是 true
$y = (true and false); //$y 的值會是 false
?>
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;
?>
PHP 與 JavaScript 不同,在組合賦值運算子時會使用一個暫存變數,因此左邊(目標)會最後被求值。
輸入
$a += $b + $c;
意義
$a = ($b + $c) + $a;
而非
$a = $a + ($b + $c);
如果目標在表達式內被修改,這點就變得相當重要。
$a = 0;
$a += (++$a) + (++$a); // 結果為 5 (而不是 4)