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