最后,我找到了一个很好的解释,帮助我理解这个问题:传递值和传递引用有什么区别?
正如Daniel Pryden所说:
简单来说:
- 传值表示将值作为函数参数传递
- 传引用表示将变量作为函数参数传递
用隐喻来说:
- 传值就像我在一张纸上写下一些东西并把它递给你。也许这是一个URL,也许是《战争与和平》的完整副本。无论它是什么,它都在我递给你的一张纸上,因此现在它有效地成为了你的一张纸。你现在可以在那张纸上涂鸦,或者用那张纸去寻找其他地方的东西并搞乱它,随便你。
- 传引用就像我给你我的笔记本,里面写着一些东西。你可以在我的笔记本上涂鸦(也许我想让你这样做,也许不想),之后我会保留我的笔记本,上面有你写下的任何涂鸦。另外,如果你或我在那里写的是关于如何找到其他地方某些信息的信息,则你或我可以去那个地方并搞乱那些信息。
在这种情况下,“只有变量应该通过引用传递”通知仍然无法证明,因为我们只对获取数组的最后一个值感兴趣。但是函数end()
被定义为:
mixed end ( array &$array )
&符号表示通过引用传递的方式是有一定原因的:end()
不仅仅返回数组的最后一个元素,还会将其内部指针改为最后一个元素。因此,这个数组被修改了。
如果我们只想返回数组的最后一个元素而不改动它,就不需要通过引用传递数组,也就不会得到这个通知。但是,end()
似乎并不是做这件事的正确函数。
如果我得到这个通知没有理由怎么办?请注意,要调用的函数可能定义错误。在我的例子中,我定义了一个函数:
private function array_flatupshift(&$array, $key = 0) {
$a = [];
foreach ($array as $item) {
if (is_object($item)) {
array_push($a, $item->$key);
} else if (is_array($item)) {
array_push($a, $item[$key]);
}
}
return $a;
}
这只是一个错误的函数定义。因此,如果你也收到类似的通知:检查你调用的函数是否被正确定义。在这里传递引用没有意义,因为传递的数组没有被修改。因此函数定义应该不包含“reference &/”:
private function array_flatupshift($array, $key = 0) {
如果你知道自己在做什么,有些情况下你可能会使用错误控制运算符。因此:
$string = "hi-dude";
echo @end(explode('-', $string));
如果不再需要explode的结果,那么这应该是可以的。但是请注意抑制所有可能错误的缺点。如果我说错了,请纠正我。
end
会影响内部指针,所以函数不返回引用,因此会出现该提示。 - Lawrence Cheroneecho $v[array_key_last($v = explode('-', $string))];
;p - Lawrence Cherone&
表示按引用传递,如果您将函数作为参数传递给另一个函数,而该函数不返回引用,则任何函数都会抛出该通知。 如果您不想看到通知或不关心它,请使用@
来抑制它,但这是另一个问题。 - Lawrence Cherone