在PHP中,可以通过在函数声明中的参数前面加上“&”号来通过引用传递函数参数,如下所示:function foo(&$bar){ // ...}现在,我知道这不是为了提高性能而设计的,而是允许函数更改通常不在其范围内的变量。取而代之的是,PHP似乎使用写时复制来避免在对象被更改之前复制对象(也许还有数组)。因此,对于不更改其参数的函数,效果应与您通过引用传递它们的效果相同。但是,我想知道写时复制逻辑是否可能在传递引用时短路,并且这是否会对性能产生影响。ETA:可以肯定的是,我认为它并不快,而且我很清楚这不是引用的目的。所以我想我自己的猜测很好,我是在寻找一个真正知道内幕下肯定会发生什么的人的答案。在PHP开发的五年中,我总是发现很难通过阅读源代码获得有关PHP内部构件的质量信息。
3 回答
互换的青春
TA贡献1797条经验 获得超6个赞
Zend Engine使用写时复制,当您自己使用引用时,会产生一些额外的开销。但是,仅在撰写本文时才能找到此提及,并且手册中的注释包含其他链接。
(编辑)关于对象和引用的手册页包含有关对象变量与引用如何不同的更多信息。
饮歌长啸
TA贡献1951条经验 获得超3个赞
我对此进行了一些测试,因为我不确定给出的答案。
我的结果表明,按引用传递大型数组或字符串的速度明显更快。
这是我的结果: 基准测试
Y轴(行程)是一个函数在一秒钟内可以调用多少次* 10
每个功能/变量重复测试8次
这是我使用的变量:
$large_array = array_fill(PHP_INT_MAX / 2, 1000, 'a');
$small_array = array('this', 'is', 'a', 'small', 'array');
$large_object = (object)$large_array;
$large_string = str_repeat('a', 100000);
$small_string = 'this is a small string';
$value = PHP_INT_MAX / 2;
这些是功能:
function pass_by_ref(&$var) {
}
function pass_by_val($var) {
}
添加回答
举报
0/150
提交
取消