php的引用,小心使用

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的一個引用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章