PHP的引用與我們常識中的C指針不同,儘管它們的部分語義是相同的(“指向”相同的 value)。
如果你要用引用來提高性能,我建議你要考慮清楚。
舉個例子
$a=[1,2,3];
var_dump($a);
foreach ($a as &$b) {
$b++;
}
// unset($b);
var_dump($a);
$c = $a;
$c[2]++;
var_dump($a);
上下兩段代碼,只有 unset($b) 這句代碼的差別,但PHP引擎做的可是天差地別。
如果 foreach 裏用了引用,那麼上圖的代碼就是一個不好的代碼實踐。
爲什麼不好?
這有個不容易覺察的地方,$a[2] 變成了一個引用類型,而不是一個大多數人認爲的整型。bug 就出來 $c[2] 的賦值也改變了$a[2]。
好的代碼實踐如下,也是我常用的。foreach 之後要 unset foreach裏的引用。這時 $a[2] 就是大家認爲的整型了。
$a=[1,2,3];
var_dump($a);
foreach ($a as &$b) {
$b++;
}
unset($b);
var_dump($a);
$c = $a;
$c[2]++;
var_dump($a);
自己運行這兩段代碼,
仔細看清楚兩段代碼var_dump的輸出的不同,
仔細看清楚兩段代碼var_dump的輸出的不同,
仔細看清楚兩段代碼var_dump的輸出的不同,
這是關鍵。
爲什麼會是這樣?這次我就不去找php的源代碼看了。
PS:
補充個知識,
$c=$a PHP引擎是做了內存拷貝給$c,有些開發會錯誤以爲引擎會優化$c爲$a的一個引用。